diff --git a/InvenTree/locale/bg/LC_MESSAGES/django.po b/InvenTree/locale/bg/LC_MESSAGES/django.po
index 80cb1b1f7f5f..5293d30fabe5 100644
--- a/InvenTree/locale/bg/LC_MESSAGES/django.po
+++ b/InvenTree/locale/bg/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Bulgarian\n"
@@ -30,20 +30,20 @@ msgstr "Потребителя няма нужното разрешение, з
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Не е зададена стойност"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Преобразуването на {original} в {unit} не беше успешно"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Зададено е недопустимо количество"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Зададено е недопустимо количество ({exc})"
@@ -65,9 +65,9 @@ msgstr "Въведи дата"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Въведеният домейн на електронната поща
 msgid "Registration is disabled."
 msgstr "Регистрацията е деактивирана."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Въведена е недопустима стойност"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Липсва сериен номер"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Повтарящ се сериен номер"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Невалиден диапазон от групи: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Не са открити серийни номера"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Премахнете HTML маркерите от тази стойност"
 
@@ -401,7 +401,7 @@ msgstr ""
 msgid "Select file to attach"
 msgstr ""
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr ""
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr ""
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr ""
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr ""
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr ""
 
@@ -678,7 +678,7 @@ msgstr ""
 msgid "Downloading images from remote URL is not enabled"
 msgstr ""
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -938,14 +938,14 @@ msgstr ""
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Цялостна наличност"
@@ -6008,7 +6016,7 @@ msgstr "Цялостна наличност"
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,600 +6432,604 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+msgid "Test template with the same key already exists for part"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "Total Stock"
 msgid "External Stock"
 msgstr "Цялостна наличност"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8027,7 +8039,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8335,16 +8347,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8364,103 +8376,111 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+msgid "Snippet file with this name already exists"
+msgstr ""
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+msgid "Asset file with this name already exists"
+msgstr ""
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8767,7 +8787,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8812,7 +8832,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8824,7 +8844,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8901,7 +8921,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8933,7 +8953,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8981,184 +9001,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/cs/LC_MESSAGES/django.po b/InvenTree/locale/cs/LC_MESSAGES/django.po
index 391b076154b7..41f6a453de7d 100644
--- a/InvenTree/locale/cs/LC_MESSAGES/django.po
+++ b/InvenTree/locale/cs/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Czech\n"
@@ -30,20 +30,20 @@ msgstr "Uživatel nemá právo zobrazit tento model"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Není k dispozici žádná hodnota"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Nelze převést {original} na {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Vyplněno neplatné množství"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Vyplněno neplatné množství ({exc})"
@@ -65,9 +65,9 @@ msgstr "Zadejte datum"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Zadaná e-mailová doména není povolena."
 msgid "Registration is disabled."
 msgstr "Registrace vypnuta."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Vyplněno neplatné množství"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Nevyplněné výrobní číslo"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Duplicitní výrobní číslo"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Neplatný rozsah skupiny: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Rozsah skupiny {group} překračuje povolené množství ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Neplatná sekvence skupiny: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Nenalezena žádná výrobní čísla"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Počet jedinečných sériových čísel ({len(serials)}) musí odpovídat množství ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Odstranit HTML tagy z této hodnoty"
 
@@ -401,7 +401,7 @@ msgstr "Příloha"
 msgid "Select file to attach"
 msgstr "Vyberte soubor k přiložení"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Komentář"
 msgid "File comment"
 msgstr "Komentář k souboru"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Duplicitní názvy nemohou existovat pod stejným nadřazeným názvem"
 msgid "Invalid choice"
 msgstr "Neplatný výběr"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Název"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Chyba serveru"
 msgid "An error has been logged by the server."
 msgstr "Server zaznamenal chybu."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Musí být platné číslo"
 
@@ -678,7 +678,7 @@ msgstr "URL souboru vzdáleného obrázku"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Stahování obrázků ze vzdálené URL není povoleno"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Kontrola procesů na pozadí se nezdařila"
 
@@ -938,14 +938,14 @@ msgstr "O InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Sestavení musí být zrušeno před odstraněním"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Spotřební materiál"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Referenční číslo objednávky"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Příkaz sestavení pro který je toto sestavení přiděleno"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Příkaz sestavení pro který je toto sestavení přiděleno"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Stav sestavení"
 msgid "Build status code"
 msgstr "Stavový kód sestavení"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Kód dávky"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Výstup sestavení neodpovídá příkazu sestavení"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Množství musí být vyšší než nula"
 
@@ -1285,10 +1285,10 @@ msgstr "Vytvořit objekt"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Vytvořit objekt"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Množství musí být 1 pro zřetězený sklad"
 msgid "Selected stock item does not match BOM line"
 msgstr "Vybraná položka zásob neodpovídá řádku BOM"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Sériová čísla"
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr "Volitelné položky"
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Jméno společnosti"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Výchozí měna"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Stáhnout z URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Možné zakoupit"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Díly jsou zakoupitelné ve výchozím nastavení"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Prodejné"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Díly jsou prodejné ve výchozím nastavení"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Sledovatelné"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Díly jsou sledovatelné ve výchozím nastavení"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Nehmotné (virtuální)"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Díly jsou nehmotné (virtuální) ve výchozím nastavení"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Zobrazit Import v zobrazeních"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Zobrazit související díly"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Zobrazit související díly pro díl"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Počáteční údaje zásob"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Povolit vytvoření počátečního skladu při přidání nové části"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Počáteční údaje dodavatele"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Povolit vytvoření počátečních dat dodavatele při přidávání nového dílu"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Formát zobrazení jména dílu"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Formát pro zobrazení názvu dílu"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Výchozí ikona kategorie dílu"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Výchozí ikona kategorie dílu (prázdné znamená bez ikony)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr "Minimální počet desetinných míst u cen"
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr "Minimální počet desetinných míst k zobrazení u cenových údajů"
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr "Maximální počet desetinných míst u cen"
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr "Maximální počet desetinných míst k zobrazení u cenových údajů"
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Použít ceny dodavatele"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Přepsání historie nákupu"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Velikost stránky"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Výchozí velikost stránky pro PDF reporty"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Povolit testovací reporty"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Povolit generování zkušebních reportů"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Připojit testovací reporty"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Při tisku testovacího reportu, připojte kopii reportu k přidružené skladové položce"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "Sériová čísla pro skladové položky musí být globálně unikátní"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Automaticky vyplnit sériová čísla"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Automaticky vyplnit sériová čísla ve formulářích"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Odstranit vyčerpané zásoby"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Určuje výchozí chování, když je vyčerpána skladová položka"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Formát data"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr "Cena"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Id"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr "Obrazek"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Základní díl"
@@ -3977,7 +3985,7 @@ msgstr "Zvolte díl"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Vyberte výrobce"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr "Hodnota parametru"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr "Smazat obrázek"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,602 +6432,608 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Příloha s tímto názvem již existuje"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "Externí odkaz"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Allocated"
 msgid "Unallocated Stock"
 msgstr "Přiděleno"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8029,7 +8043,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8337,16 +8351,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8366,103 +8380,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Příloha s tímto názvem již existuje"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Příloha s tímto názvem již existuje"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8769,7 +8795,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8814,7 +8840,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8826,7 +8852,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8903,7 +8929,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8935,7 +8961,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8983,184 +9009,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/da/LC_MESSAGES/django.po b/InvenTree/locale/da/LC_MESSAGES/django.po
index 86b13dc4a103..1d7768afdb80 100644
--- a/InvenTree/locale/da/LC_MESSAGES/django.po
+++ b/InvenTree/locale/da/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Danish\n"
@@ -30,20 +30,20 @@ msgstr "Bruger har ikke tilladelse til at se denne model"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Ingen værdi angivet"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Kunne ikke konvertere {original} til {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Ugyldigt antal angivet"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Ugyldigt antal angivet ({exc})"
@@ -65,9 +65,9 @@ msgstr "Angiv dato"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Det angivne e-mail domæne er ikke godkendt."
 msgid "Registration is disabled."
 msgstr "Registrering er deaktiveret."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Ugyldigt antal angivet"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Serienummer streng er tom"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Duplikeret serienummer"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Ugyldig gruppesekvens: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Ingen serienumre fundet"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Fjern HTML-tags fra denne værdi"
 
@@ -401,7 +401,7 @@ msgstr "Vedhæftning"
 msgid "Select file to attach"
 msgstr "Vælg fil, der skal vedhæftes"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Kommentar"
 msgid "File comment"
 msgstr "Fil kommentar"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr "Ugyldigt valg"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Navn"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Serverfejl"
 msgid "An error has been logged by the server."
 msgstr "En fejl blev logget af serveren."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Skal være et gyldigt tal"
 
@@ -678,7 +678,7 @@ msgstr "URL til ekstern billedfil"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Download af billeder fra ekstern URL er ikke aktiveret"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Kontrol af baggrundstjeneste mislykkedes"
 
@@ -938,14 +938,14 @@ msgstr "Om InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Produktion skal anulleres, før den kan slettes"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Forbrugsvare"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Produktionsordre reference"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Produktionsordre som er tildelt denne produktion"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Produktionsordre som er tildelt denne produktion"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Produktions Status"
 msgid "Build status code"
 msgstr "Produktions statuskode"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Batch Kode"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Accepter at lagervarer ikke er fuldt tildelt til denne byggeordre"
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Accepter ufuldført"
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,602 +6432,608 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Vedhæftning med dette filnavn findes allerede"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "Ekstern link"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Accept Unallocated"
 msgid "Unallocated Stock"
 msgstr "Accepter Ikke tildelt"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8029,7 +8043,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8337,16 +8351,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8366,103 +8380,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Vedhæftning med dette filnavn findes allerede"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Vedhæftning med dette filnavn findes allerede"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8769,7 +8795,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8814,7 +8840,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8826,7 +8852,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8903,7 +8929,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8935,7 +8961,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8983,184 +9009,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index 368e85e894b5..2ecbc7a402a9 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-03-11 09:31\n"
 "Last-Translator: \n"
 "Language-Team: German\n"
@@ -30,20 +30,20 @@ msgstr "Benutzer hat keine Berechtigung, dieses Modell anzuzeigen"
 msgid "Invalid unit provided ({unit})"
 msgstr "Ungültige Einheit angegeben ({unit})"
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Kein Wert angegeben"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Konnte {original} nicht in {unit} umwandeln"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Ungültige Menge"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Ungültige Menge ({exc})"
@@ -65,9 +65,9 @@ msgstr "Datum eingeben"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Die angegebene E-Mail-Domain ist nicht freigegeben."
 msgid "Registration is disabled."
 msgstr "Registrierung ist deaktiviert."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Keine gültige Menge"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Keine Seriennummer angegeben"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Duplizierter Seriennummer"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Ungültiger Gruppenbereich: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Gruppenbereich {group} überschreitet die zulässige Menge ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Ungültige Gruppensequenz: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Keine Seriennummern gefunden"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Anzahl der eindeutigen Seriennummern ({len(serials)}) muss mit der Menge übereinstimmen ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Entferne HTML-Tags von diesem Wert"
 
@@ -401,7 +401,7 @@ msgstr "Anhang"
 msgid "Select file to attach"
 msgstr "Datei zum Anhängen auswählen"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Kommentar"
 msgid "File comment"
 msgstr "Datei-Kommentar"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Doppelte Namen können nicht unter dem selben Elternteil existieren"
 msgid "Invalid choice"
 msgstr "Ungültige Auswahl"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Name"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Serverfehler"
 msgid "An error has been logged by the server."
 msgstr "Ein Fehler wurde vom Server protokolliert."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Muss eine gültige Nummer sein"
 
@@ -678,7 +678,7 @@ msgstr "URL der Remote-Bilddatei"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Das Herunterladen von Bildern von Remote-URLs ist nicht aktiviert"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Hintergrund-Prozess-Kontrolle fehlgeschlagen"
 
@@ -938,14 +938,14 @@ msgstr "Über InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Bauauftrag muss abgebrochen werden, bevor er gelöscht werden kann"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Verbrauchsmaterial"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Bauauftragsreferenz"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Bauauftrags-Status"
 msgid "Build status code"
 msgstr "Bau-Statuscode"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Losnummer"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Endprodukt stimmt nicht mit dem Bauauftrag überein"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Anzahl muss größer Null sein"
 
@@ -1285,10 +1285,10 @@ msgstr "Objekt bauen"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Objekt bauen"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein"
 msgid "Selected stock item does not match BOM line"
 msgstr "Ausgewählter Lagerbestand stimmt nicht mit BOM-Linie überein"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Ganzzahl für verfolgbare Teile erforderlich"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Ganzzahl erforderlich da die Stückliste nachverfolgbare Teile enthält"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Seriennummer"
@@ -1451,10 +1451,10 @@ msgstr "Die folgenden Seriennummern existieren bereits oder sind ungültig"
 msgid "A list of build outputs must be provided"
 msgstr "Eine Liste von Endprodukten muss angegeben werden"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Lagerort für fertige Endprodukte"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Akzeptieren, dass Lagerartikel diesem Bauauftrag nicht vollständig zuge
 msgid "Required stock has not been fully allocated"
 msgstr "Benötigter Bestand wurde nicht vollständig zugewiesen"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Unvollständig Zuweisung akzeptieren"
 
@@ -1602,11 +1602,11 @@ msgstr "Bauauftragspositionsartikel"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part muss auf dasselbe Teil verweisen wie der Bauauftrag"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "Teil muss auf Lager sein"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Verfügbare Menge ({q}) überschritten"
@@ -1619,7 +1619,7 @@ msgstr "Für Zuweisung von verfolgten Teilen muss ein Endprodukt angegeben sein"
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "Endprodukt kann bei Zuweisung nicht-verfolgter Teile nicht angegeben werden"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Zuweisungen müssen angegeben werden"
 
@@ -1659,7 +1659,7 @@ msgstr "Optionale Positionen"
 msgid "Allocate optional BOM items to build order"
 msgstr "Optionale Stücklisten-Positionen dem Bauauftrag hinzufügen"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Stücklisten-Position"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr "Zugewiesener Bestand"
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr "Zugewiesener Bestand"
 msgid "On Order"
 msgstr "Bestellt"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr "In Produktion"
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1400 @@ msgstr "Projektbeschreibung"
 msgid "User or group responsible for this project"
 msgstr "Benutzer oder Gruppe verantwortlich für dieses Projekt"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird nicht beachtet)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Einstellungs-Wert"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "Wert ist keine gültige Option"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "Wahrheitswert erforderlich"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "Nur Ganzzahl eingeben"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "Schlüsseltext muss eindeutig sein"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Keine Gruppe"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Eine leere Domain ist nicht erlaubt."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Ungültiger Domainname: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Kein Plugin"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Neustart erforderlich"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "Eine Einstellung wurde geändert, die einen Neustart des Servers erfordert"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Ausstehende Migrationen"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr "Anzahl der ausstehenden Datenbankmigrationen"
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Name der Serverinstanz"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "Kurze Beschreibung der Instanz"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Name der Instanz verwenden"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Den Namen der Instanz in der Titelleiste verwenden"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Anzeige von `Über` einschränken"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Zeige das `Über` Fenster nur Administratoren"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Firmenname"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "interner Firmenname"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "Basis-URL"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "Basis-URL für dieses Instanz"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Standardwährung"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr "Wählen Sie die Basiswährung für Preisberechnungen aus"
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr "Währungsaktualisierungsintervall"
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr "Wie oft Wechselkurse aktualisiert werden sollen (auf Null zum Deaktivieren setzen)"
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "Tage"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr "Währungs-Aktualisierungs-Plugin"
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr "Zu verwendendes Währungs-Aktualisierungs-Plugin"
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Von URL herunterladen"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Herunterladen von externen Bildern und Dateien von URLs erlaubt"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Download-Größenlimit"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Maximal zulässige Größe für heruntergeladene Bilder"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "Benutzer-Agent zum Herunterladen von Daten"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "Überschreiben des Benutzer-Agenten, der verwendet wird, um Bilder und Dateien von externer Servern herunterzuladen (leer für die Standardeinstellung)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr "Strenge URL-Prüfung"
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr "Erfordert die Schema-Spezifikation bei der Validierung von URLs"
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Bestätigung verpflichtend"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Eine ausdrückliche Benutzerbestätigung für bestimmte Aktionen erfordern."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Baumtiefe"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Standard Ebene für Baumansicht. Tiefere Ebenen können bei Bedarf nachgeladen werden."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Prüfungsintervall aktualisieren"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Wie oft soll nach Updates gesucht werden? (auf 0 setzen zum Deaktivieren)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Automatische Sicherung"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Automatische Sicherung der Datenbank- und Mediendateien aktivieren"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Intervall für automatische Sicherung"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Anzahl der Tage zwischen automatischen Sicherungen"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Aufgabenlöschinterval"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "Ergebnisse der Hintergrundaufgabe werden nach der angegebenen Anzahl von Tagen gelöscht"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr "Löschintervall für Fehlerprotokolle"
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "Fehlerprotokolle werden nach der angegebenen Anzahl von Tagen gelöscht"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr "Löschintervall für Benachrichtigungen"
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Benutzerbenachrichtigungen werden nach der angegebenen Anzahl von Tagen gelöscht"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Bacode-Feature verwenden"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr "Barcode-Scanner Unterstützung im Webinterface aktivieren"
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Barcode-Eingabeverzögerung"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Verzögerungszeit bei Barcode-Eingabe"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Barcode Webcam-Unterstützung"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Barcode-Scannen über Webcam im Browser erlauben"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr "Artikelrevisionen"
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr "Revisions-Feld für Artikel aktivieren"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "IPN Regex"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "RegEx Muster für die Zuordnung von Teil-IPN"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Mehrere Artikel mit gleicher IPN erlaubt"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Mehrere Artikel mit gleicher IPN erlaubt"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Ändern von IPN erlaubt"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Ändern der IPN während des Bearbeiten eines Teils erlaubt"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Teil-Stückliste kopieren"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Stückliste von Teil kopieren wenn das Teil dupliziert wird "
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Teil-Parameter kopieren"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Parameter-Daten für dieses Teil kopieren wenn das Teil dupliziert wird"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Teil-Testdaten kopieren"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Test-Daten für dieses Teil kopieren wenn das Teil dupliziert wird"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Kategorie-Parametervorlage kopieren"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Kategorie-Parameter Vorlagen kopieren wenn ein Teil angelegt wird"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Vorlage"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Teile sind standardmäßig Vorlagen"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Baugruppe"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Teile können standardmäßig aus anderen Teilen angefertigt werden"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Komponente"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Teile können standardmäßig in Baugruppen benutzt werden"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Kaufbar"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Artikel sind grundsätzlich kaufbar"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Verkäuflich"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Artikel sind grundsätzlich verkaufbar"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Nachverfolgbar"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Artikel sind grundsätzlich verfolgbar"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Virtuell"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Teile sind grundsätzlich virtuell"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Import in Ansichten anzeigen"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Importassistent in einigen Teil-Ansichten anzeigen"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Verwandte Teile anzeigen"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Verwandte Teile eines Teils anzeigen"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Initialer Lagerbestand"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Erstellen von Lagerbestand beim Hinzufügen eines neuen Teils erlauben"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Initiale Lieferantendaten"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Erstellen von Lieferantendaten beim Hinzufügen eines neuen Teils erlauben"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Anzeigeformat für Teilenamen"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Format für den Namen eines Teiles"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Standardsymbol der Teilkategorie"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Standardsymbol der Teilkategorie (leer bedeutet kein Symbol)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr "Parameter Einheiten durchsetzen"
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr "Wenn Einheiten angegeben werden, müssen die Parameterwerte mit den angegebenen Einheiten übereinstimmen"
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr "Dezimalstellen für minimalen Preis"
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr "Mindestanzahl der Dezimalstellen bei der Darstellung der Preisdaten"
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr "Dezimalstellen für maximalen Preis"
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr "Maximale Anzahl der Dezimalstellen bei der Darstellung der Preisdaten"
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Zulieferer-Preise verwenden"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr "Lieferanten-Staffelpreise in die Gesamt-Preisberechnungen einbeziehen"
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Kaufverlauf überschreiben"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr "Historische Bestellungspreise überschreiben die Lieferanten-Staffelpreise"
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Lagerartikel-Preis verwenden"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "Preise aus manuell eingegebenen Lagerdaten für Preisberechnungen verwenden"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Lagerartikelpreis Alter"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Lagerartikel, die älter als diese Anzahl an Tagen sind, von der Preisberechnung ausschließen"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr "Variantenpreise verwenden"
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr "Variantenpreise in die Gesamt-Preisberechnungen einbeziehen"
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Nur aktive Varianten"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr "Nur aktive Variantenteile zur Berechnung der Variantenbepreisung verwenden"
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr "Intervall für Neuberechnung von Preisen"
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr "Anzahl der Tage bis die Teile-Preisberechnungen automatisch aktualisiert werden"
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Interne Preise"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "Interne Preise für Teile aktivieren"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Interne Preisüberschreibung"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr "Falls verfügbar, überschreiben interne Preise Preispannenberechnungen"
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Labeldruck aktivieren"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Labeldruck über die Website aktivieren"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "Label Bild DPI"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr "DPI-Auflösung bei der Erstellung von Bilddateien für Etikettendruck-Plugins"
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Berichte aktivieren"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Berichterstellung aktivieren"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Entwickler-Modus"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Berichte im Entwickler-Modus generieren (als HTML)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+#, fuzzy
+#| msgid "No errors"
+msgid "Log Report Errors"
+msgstr "Keine Fehler"
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Seitengröße"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Standardseitenformat für PDF-Bericht"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Testberichte aktivieren"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Erstellung von Test-Berichten aktivieren"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Testberichte anhängen"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Beim Drucken eines Testberichts dem zugehörigen Lagerbestand eine Kopie des Testberichts beifügen"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr "Global einzigartige Seriennummern"
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "Seriennummern für Lagerartikel müssen global eindeutig sein"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Seriennummern automatisch ausfüllen"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Seriennummern in Formularen automatisch ausfüllen"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Erschöpften Lagerartikel löschen"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Legt das Standardverhalten fest, wenn ein Lagerartikel erschöpft ist"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr "Losnummer Vorlage"
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Vorlage für die Generierung von Standard-Losnummern für Lagerbestände"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Bestands-Ablauf"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "Ablaufen von Bestand ermöglichen"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "Abgelaufenen Bestand verkaufen"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "Verkauf von abgelaufenem Bestand erlaubt"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Bestands-Stehzeit"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Anzahl an Tagen, an denen Bestand als abgestanden markiert wird, bevor sie ablaufen"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Abgelaufenen Bestand verbauen"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Verbauen von abgelaufenen Bestand erlaubt"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "Bestands-Eigentümerkontrolle"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Eigentümerkontrolle für Lagerorte und Teile aktivieren"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr "Standardsymbol für Lagerort"
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr "Standardsymbol für Lagerstandort (leer bedeutet kein Symbol)"
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr "Zeige installierte Lagerartikel"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr "Anzeige der installierten Lagerartikel in Bestandstabellen"
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Bauauftragsreferenz-Muster"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Benötigtes Muster für die Generierung des Referenzfeldes für Bauaufträge"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr "Rücksendungen aktivieren"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr "Aktivieren der Rücksendung-Funktion in der Benutzeroberfläche"
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr "Referenz Muster für Rücksendungen"
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr "Benötigtes Muster für die Generierung des Referenzfeldes für Rücksendungen"
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr "Abgeschlossene Rücksendungen bearbeiten"
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr "Bearbeitung von Rücksendungen nach Abschluss erlauben"
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr "Auftragsreferenz-Muster"
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr "Benötigtes Muster für die Generierung des Referenzfeldes für Aufträge"
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr "Auftrag Standardsendung"
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr "Erstelle eine Standardsendung für Aufträge"
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr "Abgeschlossene Aufträge bearbeiten"
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr "Bearbeitung von Aufträgen nach Versand oder Abschluss erlauben"
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr "Bestellungsreferenz-Muster"
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr "Benötigtes Muster für die Generierung des Referenzfeldes für Bestellungen"
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Abgeschlossene Einkaufsaufträge bearbeiten"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr "Bearbeitung von Einkaufsaufträgen nach Versand oder Abschluss erlauben"
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr "Bestellungen automatisch abschließen"
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr "Bestellung automatisch als abgeschlossen markieren, wenn der Empfang aller Artikel bestätigt wurde"
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Passwort vergessen aktivieren"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Passwort-vergessen-Funktion auf den Anmeldeseiten aktivieren"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Registrierung erlauben"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Selbstregistrierung für Benutzer auf den Anmeldeseiten aktivieren"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "SSO aktivieren"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "SSO auf den Anmeldeseiten aktivieren"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "SSO Selbstregistrierung aktivieren"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr "Selbstregistrierung über SSO für Benutzer auf den Anmeldeseiten aktivieren"
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Email-Adresse erforderlich"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr "Benutzer müssen bei der Registrierung eine E-Mail angeben"
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "SSO-Benutzer automatisch ausfüllen"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Benutzer-Details automatisch aus SSO-Konto ausfüllen"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "E-Mail zweimal"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "Bei der Registrierung den Benutzer zweimal nach der E-Mail-Adresse fragen"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Passwort zweimal"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "Bei der Registrierung den Benutzer zweimal nach dem Passwort fragen"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Erlaubte Domains"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr "Anmeldung auf bestimmte Domänen beschränken (kommagetrennt, beginnend mit @)"
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Gruppe bei Registrierung"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr "Gruppe der neue Benutzer bei der Registrierung zugewiesen werden"
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "MFA erzwingen"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Benutzer müssen Multifaktor-Authentifizierung verwenden."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Plugins beim Start prüfen"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr "Beim Start überprüfen, ob alle Plugins installiert sind - Für Container aktivieren"
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr "Nach Plugin-Aktualisierungen suchen"
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr "Periodische Überprüfungen auf Updates für installierte Plugins aktivieren"
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "URL-Integration aktivieren"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "Plugins zum Hinzufügen von URLs aktivieren"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr "Navigations-Integration aktivieren"
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr "Plugins zur Integration in die Navigation aktivieren"
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "App-Integration aktivieren"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "Plugins zum Hinzufügen von Apps aktivieren"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr "Terminplan-Integration aktivieren"
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Geplante Aufgaben aktivieren"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr "Ereignis-Integration aktivieren"
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr "Plugins ermöglichen auf interne Ereignisse zu reagieren"
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr "Projektcodes aktivieren"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr "Aktiviere Projektcodes für die Verfolgung von Projekten"
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr "Inventurfunktionen"
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr "Inventur-Funktionen zur Aufzeichnung von Lagerbeständen und zur Berechnung des Lagerwerts aktivieren"
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr "Externe Standorte ausschließen"
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr "Lagerartikeln in externen Standorten in der Berechnungen zur Bestandsaufnahme ausschließen"
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr "Automatische Inventur-Periode"
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr "Anzahl der Tage zwischen automatischen Bestandsaufnahmen (zum Deaktivieren auf Null setzen)"
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr "Löschintervall für Berichte"
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr "Inventurberichte werden nach der angegebenen Anzahl von Tagen gelöscht"
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr "Vollständige Namen von Benutzern anzeigen"
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr "Vollständigen Namen von Benutzern anstatt Benutzername anzeigen"
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr "Blockieren bis Test bestanden"
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr "Verhindert die Fertigstellung bis alle erforderlichen Tests bestanden sind"
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird nicht beachtet)"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr "Inaktive Teile ausblenden"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr "Ausblenden inaktiver Teile in den auf der Startseite angezeigten Ergebnissen"
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Abonnierte Teile anzeigen"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Zeige abonnierte Teile auf der Startseite"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Abonnierte Kategorien anzeigen"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Zeige abonnierte Teilkategorien auf der Startseite"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Neueste Teile anzeigen"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Zeige neueste Teile auf der Startseite"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Nicht validierte Stücklisten anzeigen"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Zeige Stücklisten, die noch nicht validiert sind, auf der Startseite"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Neueste Bestandänderungen anzeigen"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Zeige zuletzt geänderte Lagerbestände auf der Startseite"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Niedrigen Bestand anzeigen"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Zeige geringen Bestand auf der Startseite"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Lerren Bestand anzeigen"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Zeige aufgebrauchte Lagerartikel auf der Startseite"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Benötigten Bestand anzeigen"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Zeige Bestand für Bauaufträge auf der Startseite"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Abgelaufenen Bestand anzeigen"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Zeige abgelaufene Lagerbestände auf der Startseite"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Alten Bestand anzeigen"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Zeige überfällige Lagerartikel auf der Startseite"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Ausstehende Bauaufträge anzeigen"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Zeige ausstehende Bauaufträge auf der Startseite"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Zeige überfällige Bauaufträge"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Zeige überfällige Bauaufträge auf der Startseite"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr "Ausstehende POs anzeigen"
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr "Zeige ausstehende POs auf der Startseite"
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Überfällige POs anzeigen"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr "Zeige überfällige POs auf der Startseite"
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr "Ausstehende SOs anzeigen"
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr "Zeige ausstehende SOs auf der Startseite"
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Überfällige SOs anzeigen"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr "Zeige überfällige SOs auf der Startseite"
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr "Ausstehende Versandaufträge anzeigen"
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr "Ausstehende Versandaufträge auf der Startseite anzeigen"
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Zeige Neuigkeiten"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Neuigkeiten auf der Startseite anzeigen"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "Label inline anzeigen"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "PDF-Labels im Browser anzeigen, anstatt als Datei herunterzuladen"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr "Standard-Etikettendrucker"
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr "Einen standardmäßig ausgewählten Etikettendrucker konfigurieren"
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr "Berichte inline anzeigen"
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "PDF-Berichte im Browser anzeigen, anstatt als Datei herunterzuladen"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Teile suchen"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr "Teile in der Suchvorschau anzeigen"
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr "Zulieferteile durchsuchen"
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr "Zuliefererteile in der Suchvorschau anzeigen"
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Herstellerteile durchsuchen"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr "Herstellerteile in der Suchvorschau anzeigen"
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Inaktive Teile ausblenden"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr "Inaktive Teile in der Suchvorschau ausblenden"
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr "Kategorien durchsuchen"
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr "Teilekategorien in der Suchvorschau anzeigen"
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Bestand durchsuchen"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Lagerartikel in Suchvorschau anzeigen"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Nicht verfügbare Artikel ausblenden"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Nicht verfügbare Lagerartikel aus der Suchvorschau ausschließen"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Lagerorte durchsuchen"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr "Lagerorte in Suchvorschau anzeigen"
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Firmen durchsuchen"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr "Firmen in der Suchvorschau anzeigen"
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Bauaufträge durchsuchen"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr "Bauaufträge in der Suchvorschau anzeigen"
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Bestellungen durchsuchen"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr "Bestellungen in der Suchvorschau anzeigen"
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Inaktive Bestellungen ausblenden"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr "Inaktive Bestellungen in der Suchvorschau ausblenden"
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Aufträge durchsuchen"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr "Aufträge in der Suchvorschau anzeigen"
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr "Inaktive Aufträge ausblenden"
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr "Inaktive Aufträge in der Suchvorschau ausblenden"
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Suche nach Rücksendungen"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr "Rücksendungen in der Suchvorschau anzeigen"
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr "Inaktive Rücksendungen ausblenden"
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr "Inaktive Rücksendungen in der Suchvorschau ausblenden"
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "Anzahl Suchergebnisse"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr "Anzahl der Ergebnisse, die in der Vorschau pro Sektion angezeigt werden sollen"
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Regex Suche"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr "Reguläre Ausdrücke in Suchabfragen aktivieren"
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr "Ganzes Wort suchen"
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr "Suchabfragen liefern Ergebnisse für ganze Wortkombinationen"
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "zeige Bestand in Eingabemasken"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "Zeige den verfügbaren Bestand in einigen Eingabemasken"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr "Esc-Taste schließt Formulare"
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr "Benutze die Esc-Taste, um Formulare zu schließen"
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Fixierter Navigationsleiste"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr "Position der Navigationsleiste am oberen Bildschirmrand fixieren"
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Datumsformat"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Bevorzugtes Format für die Anzeige von Daten"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Teilzeitplanung"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr "Zeige Zeitplanung für Teile"
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr "Inventur"
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr "Zeigt Inventur-Informationen an (falls die Inventurfunktion aktiviert ist)"
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr "Zeichenkettenlänge in Tabellen"
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr "Maximale Länge für Zeichenketten, die in Tabellenansichten angezeigt werden"
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr "Standardvorlage für Teilebeschriftung"
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr "Die Teil-Etikettenvorlage, die automatisch ausgewählt werden soll"
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr "Lagerartikel-Standardvorlage"
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr "Die Lagerartikel-Etikettenvorlage soll automatisch ausgewählt werden"
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr "Standardetikettenvorlage für Lagerstandort"
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr "Die Lagerstandort-Etikettenvorlage, die automatisch ausgewählt werden soll"
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr "Fehlerberichte empfangen"
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr "Benachrichtigungen bei Systemfehlern erhalten"
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr "Zuletzt verwendete Druckmaschinen"
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr "Die zuletzt benutzten Druckmaschinen für einen Benutzer speichern"
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr "Preisstaffelungs Anzahl"
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3518,23 @@ msgstr "Preisstaffelungs Anzahl"
 msgid "Price"
 msgstr "Preis"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr "Stückpreis für die angegebene Anzahl"
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Endpunkt"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr "Endpunkt, an dem dieser Webhook empfangen wird"
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr "Name für diesen Webhook"
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3544,101 @@ msgstr "Name für diesen Webhook"
 msgid "Active"
 msgstr "Aktiv"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr "Ist dieser Webhook aktiv"
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Token"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Token für Zugang"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Geheimnis"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr "Shared Secret für HMAC"
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "Nachrichten-ID"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr "Eindeutige Kennung für diese Nachricht"
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Host"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr "Host von dem diese Nachricht empfangen wurde"
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Kopfzeile"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "Header dieser Nachricht"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Body"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr "Body dieser Nachricht"
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr "Endpunkt, über den diese Nachricht empfangen wurde"
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr "Bearbeitet"
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr "Wurde die Arbeit an dieser Nachricht abgeschlossen?"
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "ID"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Titel"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Veröffentlicht"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Autor"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Zusammenfassung"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Gelesen"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr "Wurde diese Nachricht gelesen?"
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3648,31 @@ msgstr "Wurde diese Nachricht gelesen?"
 msgid "Image"
 msgstr "Bild"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "Bilddatei"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr "Einheitsname muss eine gültige Kennung sein"
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr "Einheitsname"
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr "Symbol"
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr "Optionales Einheitssymbol"
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr "Definition"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr "Einheitsdefinition"
 
@@ -3966,7 +3976,7 @@ msgid "Link to address information (external)"
 msgstr "Link zu Adressinformationen (extern)"
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Basisteil"
@@ -3977,7 +3987,7 @@ msgstr "Teil auswählen"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4002,7 @@ msgid "Select manufacturer"
 msgstr "Hersteller auswählen"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4048,7 @@ msgid "Parameter value"
 msgstr "Parameterwert"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4074,7 @@ msgstr "Verlinktes Herstellerteil muss dasselbe Basisteil referenzieren"
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4091,7 @@ msgstr "Zulieferer"
 msgid "Select supplier"
 msgstr "Zulieferer auswählen"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Lagerbestandseinheit (SKU) des Zulieferers"
 
@@ -4098,13 +4108,13 @@ msgid "Supplier part description"
 msgstr "Zuliefererbeschreibung des Teils"
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Notiz"
 
@@ -4117,7 +4127,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Mindestpreis"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4233,7 @@ msgstr "Bild löschen"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4444,7 @@ msgstr "Keine Herstellerdaten verfügbar"
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4544,7 @@ msgid "No supplier information available"
 msgstr "Keine Lieferanteninformationen verfügbar"
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4594,10 @@ msgid "Update Part Availability"
 msgstr "Verfügbarkeit der Teile aktualisieren"
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4657,7 @@ msgstr "Label"
 msgid "Label template file"
 msgstr "Label-Vorlage-Datei"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4683,7 @@ msgstr "Höhe [mm]"
 msgid "Label height, specified in mm"
 msgstr "Label-Höhe in mm"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Dateinamen-Muster"
 
@@ -4687,8 +4697,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr "Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Filter"
 
@@ -4846,11 +4856,11 @@ msgstr "Rücksendeauftrag"
 msgid "Total price for this order"
 msgstr "Gesamtpreis für diese Bestellung"
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr "Auftragswährung"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr "Währung für diesen Auftrag (leer lassen, um Firmenstandard zu verwenden)"
 
@@ -5037,7 +5047,7 @@ msgstr "Empfangen"
 msgid "Number of items received"
 msgstr "Empfangene Objekt-Anzahl"
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5102,8 @@ msgstr "Kontrolliert von"
 msgid "User who checked this shipment"
 msgstr "Benutzer, der diese Sendung kontrolliert hat"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Sendung"
 
@@ -5141,7 +5151,7 @@ msgstr "Kann Lagerartikel keiner Zeile ohne Teil hinzufügen"
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "Die zugeordnete Anzahl darf nicht die verfügbare Anzahl überschreiten"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Anzahl für serialisierte Lagerartikel muss 1 sein"
 
@@ -5215,159 +5225,159 @@ msgstr "Ergebnis für dieses Zeilenelement"
 msgid "Cost associated with return or repair for this line item"
 msgstr "Kosten für die Rückgabe oder Reparatur dieses Objektes"
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "Bestellung kann nicht verworfen werden"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr "Erlaube das Schließen des Auftrags mit unvollständigen Positionen"
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr "Auftrag hat unvollständige Positionen"
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "Der Auftrag ist nicht offen"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr "Automatische Preisgestaltung"
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr "Kaufpreis automatisch basierend auf Lieferantenbestandsdaten berechnen"
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Kaufpreiswährung"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr "Elemente zusammenfügen"
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr "Zusammenführen von Elementen mit dem gleichen Teil, Ziel- und Zieldatum zu einem Zeilenelement"
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr "Zuliefererteil muss ausgewählt werden"
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr "Bestellung muss angegeben sein"
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr "Lieferant muss mit der Bestellung übereinstimmen"
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr "Die Bestellung muss mit dem Lieferant übereinstimmen"
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr "Position"
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr "Position stimmt nicht mit Kaufauftrag überein"
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr "Zielort für empfangene Teile auswählen"
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr "Losnummer für eingehende Lagerartikel"
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Seriennummern für eingehende Lagerartikel"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Barcode"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr "Gescannter Barcode"
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "Barcode ist bereits in Verwendung"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Ganzzahl für verfolgbare Teile erforderlich"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr "Positionen müssen angegeben werden"
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr "Ziel-Lagerort muss angegeben werden"
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr "Barcode muss eindeutig sein"
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr "Verkaufspreis-Währung"
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr "Keine Sendungsdetails angegeben"
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr "Position ist nicht diesem Auftrag zugeordnet"
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr "Anzahl muss positiv sein"
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Seriennummern zum Zuweisen eingeben"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr "Sendung wurde bereits versandt"
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr "Sendung ist nicht diesem Auftrag zugeordnet"
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr "Folgende Serienummern konnten nicht gefunden werden"
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr "Folgende Seriennummern sind bereits zugewiesen"
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr "Artikel der Bestellzeile zurücksenden"
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr "Artikel entspricht nicht der Rücksendeschrift"
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr "Artikel wurde bereits erhalten"
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr "Artikel können nur bei laufenden Bestellungen empfangen werden"
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr "Verkaufspreis-Währung"
 
@@ -5771,12 +5781,12 @@ msgstr "Stückpreis für {part} auf {price} aktualisiert"
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr "{part} Stückpreis auf {price} und Menge auf {qty} aktualisiert"
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "Teil-ID"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Name des Teils"
@@ -5793,7 +5803,7 @@ msgid "IPN"
 msgstr "IPN (Interne Produktnummer)"
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Version"
@@ -5869,8 +5879,8 @@ msgstr "Name des übergeordneten Teils"
 msgid "Category Path"
 msgstr "Pfad zur Kategorie"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5903,17 @@ msgstr "Stücklisten-Position ID"
 msgid "Parent IPN"
 msgstr "Übergeordnete IPN"
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr "Teil IPN"
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr "Niedrigster Preis"
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5991,8 @@ msgstr "Gesamte Stückliste validieren"
 msgid "This option must be selected"
 msgstr "Diese Option muss ausgewählt werden"
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6009,7 @@ msgstr "Verwendet"
 msgid "Default Location"
 msgstr "Standard-Lagerort"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Gesamtbestand"
@@ -6008,7 +6018,7 @@ msgstr "Gesamtbestand"
 msgid "Input quantity for price calculation"
 msgstr "Menge für die Preisberechnung"
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Teil-Kategorie"
@@ -6090,7 +6100,7 @@ msgstr "Teil mit diesem Namen, IPN und Revision existiert bereits."
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr "Strukturellen Teilekategorien können keine Teile zugewiesen werden!"
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Name des Teils"
 
@@ -6424,598 +6434,604 @@ msgstr "Anzahl der Teile, die von der Inventur abgedeckt werden"
 msgid "User who requested this stocktake report"
 msgstr "Benutzer, der diesen Inventurbericht angefordert hat"
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr "Test-Vorlagen können nur für verfolgbare Teile angelegt werden"
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Test with this name already exists for this part"
+msgid "Test template with the same key already exists for part"
 msgstr "Ein Test mit diesem Namen besteht bereits für dieses Teil"
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Test-Name"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr "Namen für diesen Test eingeben"
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr "Testschlüssel"
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr "Vereinfachter Schlüssel zum Test"
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Test-Beschreibung"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr "Beschreibung für diesen Test eingeben"
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr "Ist dieser Test aktiviert?"
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Benötigt"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr "Muss dieser Test erfolgreich sein?"
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Erfordert Wert"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr "Muss für diesen Test ein Wert für das Test-Ergebnis eingetragen werden?"
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr "Anhang muss eingegeben werden"
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr "Muss für diesen Test ein Anhang für das Test-Ergebnis hinzugefügt werden?"
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr "Checkbox-Parameter können keine Einheiten haben"
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr "Checkbox-Parameter können keine Auswahl haben"
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr "Auswahl muss einzigartig sein"
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr "Name des Parameters"
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr "Physikalische Einheiten für diesen Parameter"
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr "Parameter-Beschreibung"
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr "Checkbox"
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr "Ist dieser Parameter eine Checkbox?"
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr "Auswahlmöglichkeiten"
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr "Gültige Optionen für diesen Parameter (durch Kommas getrennt)"
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr "Ungültige Auswahl für Parameterwert"
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr "Ausgangsteil"
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Parameter Vorlage"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Wert"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Parameter Wert"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Standard-Wert"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr "Standard Parameter Wert"
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr "Teilnummer oder Teilname"
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr "Eindeutige Teil-ID"
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr "IPN-Wert des Teils"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr "Stufe"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr "Stücklistenebene"
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr "Ausgangsteil auswählen"
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr "Untergeordnetes Teil"
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr "Teil für die Nutzung in der Stückliste auswählen"
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil"
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr "Diese Stücklisten-Position ist optional"
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr "Diese Stücklisten-Position ist ein Verbrauchsartikel (sie wird nicht in Bauaufträgen verfolgt)"
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr "Überschuss"
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Geschätzter Ausschuss (absolut oder prozentual)"
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr "Referenz der Postion auf der Stückliste"
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr "Notizen zur Stücklisten-Position"
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr "Prüfsumme"
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr "Prüfsumme der Stückliste"
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "überprüft"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr "Diese Stücklistenposition wurde validiert"
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr "Wird vererbt"
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr "Diese Stücklisten-Position wird in die Stücklisten von Teil-Varianten vererbt"
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Varianten zulassen"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr "Bestand von Varianten kann für diese Stücklisten-Position verwendet werden"
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr "Menge muss eine Ganzzahl sein"
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr "Zuliefererteil muss festgelegt sein"
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr "Stücklisten Ersatzteile"
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr "Ersatzteil kann nicht identisch mit dem Hauptteil sein"
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr "Übergeordnete Stücklisten Position"
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr "Ersatzteil"
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr "Teil 1"
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr "Teil 2"
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr "verknüpftes Teil auswählen"
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr "Teil-Beziehung kann nicht zwischen einem Teil und sich selbst erstellt werden"
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr "Doppelte Beziehung existiert bereits"
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Unter-Kategorien"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr "Ergebnisse"
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr "Anzahl der Ergebnisse, die in dieser Vorlage aufgezeichnet wurden"
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Kaufwährung dieses Lagerartikels"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr "Anzahl der Teile, die diese Vorlage verwenden"
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr "Keine Teile ausgewählt"
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr "Kategorie auswählen"
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr "Originalteil"
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr "Originalteil zum Duplizieren auswählen"
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Bild kopieren"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr "Bild vom Originalteil kopieren"
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr "Stückliste kopieren"
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr "Stückliste vom Originalteil kopieren"
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Parameter kopieren"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr "Parameterdaten vom Originalteil kopieren"
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr "Anmerkungen kopieren"
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr "Notizen aus Originalteil kopieren"
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr "Start-Bestandsmenge"
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr "Initiale Lagermenge für dieses Teil. Wenn die Menge null ist, wird kein Lagerbestand hinzugefügt."
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr "Initialer Lagerort"
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr "Lagerstandort für dieses Teil angeben"
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr "Lieferant auswählen (oder leer lassen, um zu überspringen)"
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr "Hersteller auswählen (oder leer lassen, um zu überspringen)"
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr "Hersteller-Teilenummer"
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr "Ausgewählte Firma ist kein gültiger Lieferant"
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr "Ausgewählte Firma ist kein gültiger Hersteller"
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr "Herstellerteil mit dieser MPN existiert bereits"
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr "Lieferantenteil mit dieser SKU existiert bereits"
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr "Externes Lager"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr "Nicht zugewiesenes Lager"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr "Alternatives Lager"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "Teil duplizieren"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr "Initiale Daten von anderem Teil kopieren"
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr "Initialer Lagerbestand"
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr "Erstelle Teil mit Ausgangsbestand"
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr "Lieferanteninformationen"
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr "Lieferanteninformationen zu diesem Teil hinzufügen"
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr "Kategorieparameter kopieren"
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr "Parametervorlagen aus der ausgewählten Teilkategorie kopieren"
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr "Vorhandenes Bild"
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr "Dateiname eines vorhandenen Teilbildes"
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr "Bilddatei existiert nicht"
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr "Inventurbericht auf ein bestimmtes Teil und alle Variantenteile beschränken"
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr "Inventurbericht auf eine bestimmte Teilekategorie und alle untergeordneten Kategorien beschränken"
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr "Inventurbericht auf einen bestimmten Lagerort und alle untergeordneten Lagerorte beschränken"
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr "Externen Bestand ausschließen"
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr "Lagerartikel an externen Orten ausschließen"
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Bericht generieren"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr "Erstelle Berichtsdatei mit berechneten Inventurdaten"
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr "Teile aktualisieren"
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr "Angegebene Teile mit berechneten Inventurdaten aktualisieren"
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr "Inventur-Funktionalität ist nicht aktiviert"
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr "Berechneten Wert für Mindestpreis überschreiben"
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr "Mindestpreis Währung"
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr "Berechneten Wert für maximalen Preis überschreiben"
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr "Maximalpreis Währung"
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr "Aktualisieren"
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr "Preis für dieses Teil aktualisieren"
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr "Konnte nicht von den angegebenen Währungen in {default_currency} umrechnen"
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr "Mindestpreis darf nicht größer als der Maximalpreis sein"
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr "Der Maximalpreis darf nicht kleiner als der Mindestpreis sein"
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr "Teil auswählen, von dem Stückliste kopiert wird"
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr "Bestehende Daten entfernen"
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr "Bestehende Stücklisten-Positionen vor dem Kopieren entfernen"
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr "Vererbtes einschließen"
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr "Stücklisten-Positionen einbeziehen, die von Vorlage-Teilen geerbt werden"
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr "Ungültige Zeilen überspringen"
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr "Aktiviere diese Option, um ungültige Zeilen zu überspringen"
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr "Ersatzteile kopieren"
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr "Ersatzteile beim Duplizieren von Stücklisten-Positionen kopieren"
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr "Bestehende Stückliste löschen"
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr "Bestehende Stücklisten-Positionen vor dem Importieren entfernen"
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr "Keine Teilspalte angegeben"
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr "Mehrere übereinstimmende Teile gefunden"
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr "Keine passenden Teile gefunden"
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr "Teil ist nicht als Komponente angelegt"
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr "Menge nicht angegeben"
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Ungültige Menge"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr "Mindestens eine Stückliste-Position ist erforderlich"
 
@@ -8025,7 +8041,7 @@ msgstr "Rand"
 msgid "Print a border around each label"
 msgstr "Einen Rahmen um jedes Label drucken"
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr "Querformat"
 
@@ -8333,16 +8349,16 @@ msgstr "Konfiguration löschen"
 msgid "Delete the plugin configuration from the database"
 msgstr "Plugin-Konfiguration aus der Datenbank löschen"
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "Keine korrekten Objekte für Vorlage gegeben"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr "Vorlagendatei '{template}' fehlt oder existiert nicht"
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr "Testbericht"
 
@@ -8362,103 +8378,115 @@ msgstr "US-Legal"
 msgid "Letter"
 msgstr "US-Letter"
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Vorlagen Name"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "Bericht-Vorlage Datei"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr "Bericht-Vorlage Beschreibung"
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr "Bericht Revisionsnummer (autom. erhöht)"
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr "Seitengröße für PDF-Berichte"
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr "Bericht in Querformat anzeigen"
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr "Muster für die Erstellung von Berichtsdateinamen"
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr "Bericht-Vorlage ist ein"
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr "Lagerartikel-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr "einfügen Installiert in Tests"
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr "Test-Ergebnisse für Lagerartikel in Baugruppen einschließen"
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr "Bauauftrag Filter"
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr "Bau-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Teil Filter"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr "Teile-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr "Bestellungs-Abfragefilter"
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr "Auftrags-Abfragefilter"
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr "Rückgabe von Auftragsabfragefiltern"
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Stock item with this serial number already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Ein Lagerartikel mit dieser Seriennummer existiert bereits"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Snippet"
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr "Berichts-Snippet"
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr "Snippet-Beschreibung"
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Anhang mit diesem Dateinamen bereits vorhanden"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr "Ressource"
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr "Berichts-Ressource"
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr "Ressource-Beschreibung"
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr "Filter für standortbezogene Abfragen (kommaseparierte Liste von Schlüssel=Wert-Paaren)"
 
@@ -8765,7 +8793,7 @@ msgstr "Sie können diesen Lagerort nicht als strukturell markieren, da sich ber
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr "Lagerartikel können nicht in strukturelle Lagerorte abgelegt werden!"
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr "Für virtuelle Teile können keine Lagerartikel erstellt werden"
 
@@ -8810,7 +8838,7 @@ msgstr "Passendes Zuliefererteil für diesen Lagerartikel auswählen"
 msgid "Where is this stock item located?"
 msgstr "Wo wird dieses Teil normalerweise gelagert?"
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr "Verpackung, in der dieser Lagerartikel gelagert ist"
 
@@ -8822,7 +8850,7 @@ msgstr "Ist dieses Teil in einem anderen verbaut?"
 msgid "Serial number for this item"
 msgstr "Seriennummer für dieses Teil"
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr "Losnummer für diesen Lagerartikel"
 
@@ -8899,7 +8927,7 @@ msgstr "Seriennummern muss eine Liste von Ganzzahlen sein"
 msgid "Quantity does not match serial numbers"
 msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Seriennummern existieren bereits"
 
@@ -8931,7 +8959,7 @@ msgstr "Lagerartikel wird aktuell produziert"
 msgid "Serialized stock cannot be merged"
 msgstr "Nachverfolgbare Lagerartikel können nicht zusammengeführt werden"
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr "Artikel duplizeren"
 
@@ -8979,184 +9007,184 @@ msgstr "Test Ergebnis Anhang"
 msgid "Test notes"
 msgstr "Test Notizen"
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr "Testvorlage für dieses Ergebnis"
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr "Vorlagen-ID oder Testname muss angegeben werden"
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr "Seriennummer ist zu lang"
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr "Packungsgröße beim Hinzufügen verwenden: Die definierte Menge ist die Anzahl der Pakete"
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr "Einkaufspreis dieses Lagerartikels, pro Einheit oder Verpackungseinheit"
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr "Anzahl der zu serialisierenden Lagerartikel eingeben"
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr "Anzahl darf nicht die verfügbare Menge überschreiten ({q})"
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "Seriennummern für neue Teile eingeben"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr "Ziel-Bestand"
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr "Optionales Notizfeld"
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr "Seriennummern können diesem Teil nicht zugewiesen werden"
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr "Lagerartikel für Installation auswählen"
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr "Zu installierende Menge"
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr "Anzahl der zu verwendenden Artikel eingeben"
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr " Transaktionsnotizen hinzufügen (optional)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr "Die zu verwendende Menge muss mindestens 1 sein"
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr "Lagerartikel ist nicht verfügbar"
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr "Ausgewähltes Teil ist nicht in der Stückliste"
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr "Die zu verwendende Menge darf die verfügbare Menge nicht überschreiten"
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr "Ziel Lagerort für unverbautes Objekt"
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr "Wählen Sie einen Teil aus, zu dem dieser Lagerartikel geändert werden soll"
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr "Das ausgewählte Teil ist keine gültige Option für die Umwandlung"
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr "Lagerartikel konnte nicht mit Zulieferteil zugewiesen werden"
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr "Ziel Lagerort für zurückgegebene Artikel"
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr "Lagerartikel auswählen, um den Status zu ändern"
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr "Keine Lagerartikel ausgewählt"
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Unter-Lagerorte"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr "Teil muss verkaufbar sein"
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr "Artikel ist einem Kundenauftrag zugeordnet"
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr "Artikel ist einem Fertigungsauftrag zugeordnet"
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr "Kunde zum Zuweisen von Lagerartikel"
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr "Ausgewählte Firma ist kein Kunde"
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr "Notizen zur Lagerzuordnung"
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr "Eine Liste der Lagerbestände muss angegeben werden"
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr "Notizen zur Lagerartikelzusammenführung"
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr "Unterschiedliche Lieferanten erlauben"
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr "Zusammenführen von Lagerartikeln mit unterschiedlichen Lieferanten erlauben"
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr "Unterschiedliche Status erlauben"
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr "Zusammenführen von Lagerartikeln mit unterschiedlichen Status-Codes erlauben"
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr "Mindestens zwei Lagerartikel müssen angegeben werden"
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr "Keine Änderung"
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr "Primärschlüssel Lagerelement"
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr "Lagerartikel Status-Code"
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr "Bestandsbewegungsnotizen"
 
@@ -14083,4 +14111,3 @@ msgstr "Berechtigungen Einträge zu ändern"
 #: users/models.py:413
 msgid "Permission to delete items"
 msgstr "Berechtigung Einträge zu löschen"
-
diff --git a/InvenTree/locale/el/LC_MESSAGES/django.po b/InvenTree/locale/el/LC_MESSAGES/django.po
index d671c1c73b0e..65dc006411d8 100644
--- a/InvenTree/locale/el/LC_MESSAGES/django.po
+++ b/InvenTree/locale/el/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-03-11 09:31\n"
 "Last-Translator: \n"
 "Language-Team: Greek\n"
@@ -30,20 +30,20 @@ msgstr "Δεν έχετε δικαιώματα να το δείτε αυτό"
 msgid "Invalid unit provided ({unit})"
 msgstr "Η μονάδα μέτρησης δεν είναι έγκυρη ({unit})"
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Δεν εισήχθη τιμή"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Δεν ήταν δυνατή η μετατροπή από {original} σε {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Δόθηκε μη έγκυρη ποσότητα"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Δόθηκε μη έγκυρη ποσότητα ({exc})"
@@ -65,9 +65,9 @@ msgstr "Εισάγετε ημερομηνία"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Ο παρεχόμενος τομέας ηλεκτρονικού ταχυ
 msgid "Registration is disabled."
 msgstr "Η εγγραφή είναι απενεργοποιημένη."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Μη έγκυρη ποσότητα"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Κενό σειριακό αριθμό συμβολοσειράς"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Διπλότυπο serial number"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Μη έγκυρο εύρος ομάδας: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Το εύρος της ομάδας {group} υπερβαίνει την επιτρεπόμενη ποσότητα ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Μη έγκυρη ακολουθία ομάδας: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Δεν βρέθηκαν σειριακοί αριθμοί"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Ο αριθμός μοναδικών σειριακών αριθμών ({len(serials)}) πρέπει να αντιστοιχεί στην ποσότητα ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Αφαιρέστε τα HTML tags από την τιμή που εισάγατε"
 
@@ -401,7 +401,7 @@ msgstr "Συνημμένο"
 msgid "Select file to attach"
 msgstr "Επιλέξτε αρχείο για επισύναψη"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Σχόλιο"
 msgid "File comment"
 msgstr "Σχόλιο αρχείου"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Διπλότυπα ονόματα δεν μπορούν να υπάρχ
 msgid "Invalid choice"
 msgstr "Μη έγκυρη επιλογή"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Όνομα"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Σφάλμα διακομιστή"
 msgid "An error has been logged by the server."
 msgstr "Ένα σφάλμα έχει καταγραφεί από το διακομιστή."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Πρέπει να είναι αριθμός"
 
@@ -678,7 +678,7 @@ msgstr "Διεύθυνση URL του αρχείου απομακρυσμένη
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Η λήψη εικόνων από απομακρυσμένο URL δεν είναι ενεργοποιημένη"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Ο έλεγχος εργασίας στο παρασκήνιο απέτυχε"
 
@@ -938,14 +938,14 @@ msgstr "Σχετικά με το InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Η έκδοση πρέπει να ακυρωθεί πριν διαγραφεί"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Αναλώσιμο"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Αναφορά Παραγγελίας Κατασκευής"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "BuildOrder στην οποία έχει δοθεί αυτή η κατα
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "BuildOrder στην οποία έχει δοθεί αυτή η κατα
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Κατάσταση Κατασκευής"
 msgid "Build status code"
 msgstr "Κωδικός κατάστασης κατασκευής"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Κωδικός Παρτίδας"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Η έξοδος κατασκευής δεν ταιριάζει με την παραγγελία κατασκευής"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Η ποσότητα πρέπει να είναι μεγαλύτερη από 0"
 
@@ -1285,10 +1285,10 @@ msgstr "Αντικείμενο κατασκευής"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Αντικείμενο κατασκευής"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Η ποσότητα πρέπει να είναι 1 για σειριακ
 msgid "Selected stock item does not match BOM line"
 msgstr "Το επιλεγμένο στοιχείο αποθέματος δεν ταιριάζει με τη γραμμή ΤΥ"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Ακέραιη ποσότητα που απαιτείται για αν
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Ακέραιη ποσότητα που απαιτείται, καθώς ο λογαριασμός των υλικών περιέχει ανιχνεύσιμα μέρη"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Σειριακοί αριθμοί"
@@ -1451,10 +1451,10 @@ msgstr "Οι παρακάτω σειριακοί αριθμοί υπάρχουν
 msgid "A list of build outputs must be provided"
 msgstr "Πρέπει να παρέχεται μια λίστα με τα αποτελέσματα κατασκευής"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Τοποθεσία για ολοκληρωμένα προϊόντα κα
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Αποδεχτείτε ότι αντικείμενα αποθέματο
 msgid "Required stock has not been fully allocated"
 msgstr "Το απαιτούμενο απόθεμα δεν έχει δεσμευτεί πλήρως"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Αποδοχή Μη Ολοκληρωμένων"
 
@@ -1602,11 +1602,11 @@ msgstr "Αντικείμενο Γραμμής Κατασκευής"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,598 +6432,604 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Αρχείο με αυτό το όνομα υπάρχει ήδη"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8039,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8347,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8362,103 +8376,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Αρχείο με αυτό το όνομα υπάρχει ήδη"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Αρχείο με αυτό το όνομα υπάρχει ήδη"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8791,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8836,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8822,7 +8848,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8899,7 +8925,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8931,7 +8957,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8979,184 +9005,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
@@ -14083,4 +14109,3 @@ msgstr ""
 #: users/models.py:413
 msgid "Permission to delete items"
 msgstr ""
-
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index 7d787a623453..93d66b18fe26 100644
--- a/InvenTree/locale/en/LC_MESSAGES/django.po
+++ b/InvenTree/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -31,20 +31,20 @@ msgstr ""
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr ""
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -66,9 +66,9 @@ msgstr ""
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -133,42 +133,42 @@ msgstr ""
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr ""
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr ""
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr ""
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr ""
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr ""
 
@@ -402,7 +402,7 @@ msgstr ""
 msgid "Select file to attach"
 msgstr ""
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -433,9 +433,9 @@ msgstr ""
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -480,10 +480,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr ""
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -507,10 +507,10 @@ msgstr ""
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -582,7 +582,7 @@ msgstr ""
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr ""
 
@@ -679,7 +679,7 @@ msgstr ""
 msgid "Downloading images from remote URL is not enabled"
 msgstr ""
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -939,14 +939,14 @@ msgstr ""
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1015,7 +1015,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1047,9 +1047,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1060,7 +1060,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1147,8 +1147,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1265,9 +1265,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1286,10 +1286,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1299,7 +1299,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1360,9 +1360,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1426,8 +1426,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1452,10 +1452,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,8 +1494,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1567,7 +1567,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1603,11 +1603,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1620,7 +1620,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1660,7 +1660,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1670,7 +1670,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1678,13 +1678,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2118,1390 +2118,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3509,23 +3517,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3535,101 +3543,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3639,31 +3647,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3967,7 +3975,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3978,7 +3986,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3993,7 +4001,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4039,7 +4047,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4065,7 +4073,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4082,7 +4090,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4099,13 +4107,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4118,7 +4126,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4224,7 +4232,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4435,7 +4443,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4535,7 +4543,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4585,10 +4593,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4648,7 +4656,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4674,7 +4682,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4688,8 +4696,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4847,11 +4855,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5038,7 +5046,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5093,8 +5101,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5142,7 +5150,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5216,159 +5224,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5772,12 +5780,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5794,7 +5802,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5870,8 +5878,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5894,17 +5902,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5982,8 +5990,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -6000,7 +6008,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6009,7 +6017,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6091,7 +6099,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6425,598 +6433,602 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+msgid "Test template with the same key already exists for part"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8026,7 +8038,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8334,16 +8346,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8363,103 +8375,111 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+msgid "Snippet file with this name already exists"
+msgstr ""
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+msgid "Asset file with this name already exists"
+msgstr ""
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8766,7 +8786,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8811,7 +8831,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8823,7 +8843,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8900,7 +8920,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8932,7 +8952,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8980,184 +9000,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index e2251ee9b2f4..76910cf06297 100644
--- a/InvenTree/locale/es/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-03-07 10:33\n"
 "Last-Translator: \n"
 "Language-Team: Spanish, Mexico\n"
@@ -30,20 +30,20 @@ msgstr "El usuario no tiene permiso para ver este modelo"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Ningún valor proporcionado"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "No se pudo convertir {original} a {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "La cantidad suministrada es inválida"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "La cantidad suministrada es inválida ({exc})"
@@ -65,9 +65,9 @@ msgstr "Ingrese la fecha"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "El dominio de correo electrónico proporcionado no está aprobado."
 msgid "Registration is disabled."
 msgstr "Registro deshabilitado."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Cantidad proporcionada no válida"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "No se ha proporcionado un número de serie"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Serie duplicada"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Rango de grupo inválido: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Rango del grupo {group} supera la cantidad permitida ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Secuencia de grupo inválida: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Numeros de serie no encontrados"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Los números de serie únicos ({len(serials)}) debe coincidir con la cantidad ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Eliminar etiquetas HTML de este valor"
 
@@ -401,7 +401,7 @@ msgstr "Archivo adjunto"
 msgid "Select file to attach"
 msgstr "Seleccionar archivo para adjuntar"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Comentario"
 msgid "File comment"
 msgstr "Comentario del archivo"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Los nombres duplicados no pueden existir bajo el mismo padre"
 msgid "Invalid choice"
 msgstr "Selección no válida"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Nombre"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Error de servidor"
 msgid "An error has been logged by the server."
 msgstr "Se ha registrado un error por el servidor."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Debe ser un número válido"
 
@@ -678,7 +678,7 @@ msgstr "URL de imagen remota"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "La descarga de imágenes desde la URL remota no está habilitada"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Falló la comprobación en segundo plano del worker"
 
@@ -938,14 +938,14 @@ msgstr "Acerca de InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "La compilación debe cancelarse antes de poder ser eliminada"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Consumible"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Número de orden de construcción o armado"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Orden de Construcción o Armado a la que se asigna"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Orden de Construcción o Armado a la que se asigna"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Estado de la construcción"
 msgid "Build status code"
 msgstr "Código de estado de construcción"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Numero de lote"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "La salida de la construcción no coincide con el orden de construcción"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "La cantidad debe ser mayor que cero"
 
@@ -1285,10 +1285,10 @@ msgstr "Ensamblar equipo"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Ensamblar equipo"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "La cantidad debe ser 1 para el stock serializado"
 msgid "Selected stock item does not match BOM line"
 msgstr "El artículo de almacén selelccionado no coincide con la línea BOM"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Cantidad entera requerida para partes rastreables"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Cantidad entera requerida, ya que la factura de materiales contiene partes rastreables"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Números de serie"
@@ -1451,10 +1451,10 @@ msgstr "Los siguientes números seriales ya existen o son inválidos"
 msgid "A list of build outputs must be provided"
 msgstr "Debe proporcionarse una lista de salidas de construcción"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Ubicación para las salidas de construcción completadas"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Aceptar que los artículos de stock no se han asignado completamente a e
 msgid "Required stock has not been fully allocated"
 msgstr "El stock requerido no ha sido completamente asignado"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Aceptar incompleto"
 
@@ -1602,11 +1602,11 @@ msgstr "Crear partida"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part debe apuntar a la misma parte que la orden de construcción"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "El artículo debe estar en stock"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Cantidad disponible ({q}) excedida"
@@ -1619,7 +1619,7 @@ msgstr "La salida de la construcción debe especificarse para la asignación de
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "La salida de construcción no se puede especificar para la asignación de partes no rastreadas"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Debe proporcionarse la adjudicación de artículos"
 
@@ -1659,7 +1659,7 @@ msgstr "Elementos opcionales"
 msgid "Allocate optional BOM items to build order"
 msgstr "Asignar artículos de la BOM opcionales para construir la orden"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Item de Lista de Materiales"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr "Stock Asignado"
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr "Stock Asignado"
 msgid "On Order"
 msgstr "En pedido"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr "En producción"
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1400 @@ msgstr "Descripción del proyecto"
 msgid "User or group responsible for this project"
 msgstr "Usuario o grupo responsable de este projecto"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Clave de configuración (debe ser única - mayúsculas y minúsculas)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Valor de ajuste"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "El valor elegido no es una opción válida"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "El valor debe ser un valor booleano"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "El valor debe ser un entero"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "Cadena de clave debe ser única"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Sin grupo"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Un dominio vacío no está permitido."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Nombre de dominio inválido: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Sin plugin"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Reinicio requerido"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "Se ha cambiado una configuración que requiere un reinicio del servidor"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Migraciones pendientes"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr "Número de migraciones de base de datos pendientes"
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Nombre de la instancia del servidor"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "Descriptor de cadena para la instancia del servidor"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Usar nombre de instancia"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Utilice el nombre de la instancia en la barra de título"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Restringir mostrar 'acerca de'"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Mostrar la modal `about` solo para superusuarios"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Nombre de empresa"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Nombre interno de empresa"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "URL Base"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "URL base para la instancia del servidor"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Moneda predeterminada"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr "Seleccione la moneda base para los cálculos de precios"
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr "Intervalo de actualización de moneda"
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr "Con qué frecuencia actualizar los tipos de cambio (establecer a cero para desactivar)"
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "días"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr "Plugin de Actualización de Moneda"
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr "Plugin de actualización de moneda a usar"
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Descargar desde URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Permitir la descarga de imágenes y archivos remotos desde la URL externa"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Límite de tamaño de descarga"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Tamaño máximo de descarga permitido para la imagen remota"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "Agente de usuario usado para descargar desde la URL"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "Permitir reemplazar el agente de usuario utilizado para descargar imágenes y archivos desde URL externa (dejar en blanco para el valor predeterminado)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr "Validación estricta de URL"
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr "Requerir especificación de esquema al validar URLs"
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Requiere confirmación"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Requiere confirmación explícita del usuario para ciertas acciones."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Profundidad del árbol"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Profundidad de árbol predeterminada para treeview. Los niveles más profundos pueden ser cargados perezosamente a medida que son necesarios."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Actualizar intervalo de actualización"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Con qué frecuencia comprobar actualizaciones (establecer a cero para desactivar)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Copia de seguridad automática"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Activar copia de seguridad automática de los archivos de base de datos y medios"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Intervalo de respaldo automático"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Especificar número de días entre eventos automatizados de copia de seguridad"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Intervalo de eliminación de tareas"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "Los resultados de las tareas en segundo plano se eliminarán después del número especificado de días"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr "Intervalo de eliminación de registro de errores"
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "Los registros de errores se eliminarán después del número especificado de días"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr "Intervalo de eliminación de notificaciones"
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Las notificaciones de usuario se eliminarán después del número especificado de días"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Soporte de código de barras"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr "Habilitar el soporte para escáner de códigos de barras en la interfaz web"
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Retraso de entrada de código de barras"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Tiempo de retraso en la lectura de códigos de barras"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Soporte para Webcam de código de barras"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Permitir escaneo de código de barras a través de webcam en el navegador"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr "Revisiones de partes"
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr "Habilitar campo de revisión para parte"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "Regex IPN"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Patrón de expresión regular para IPN de la parte coincidente"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Permitir IPN duplicado"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Permitir que varias partes compartan el mismo IPN"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Permitir editar IPN"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Permite cambiar el valor de IPN mientras se edita una parte"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Copiar parte de datos BOM"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Copiar datos BOM por defecto al duplicar una parte"
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Copiar parámetros de parte"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Copiar datos de parámetro por defecto al duplicar una parte"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Copiar parte de datos de prueba"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Copiar datos de parámetro por defecto al duplicar una parte"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Copiar plantillas de parámetros de categoría"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Copiar plantillas de parámetros de categoría al crear una parte"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Plantilla"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Las partes son plantillas por defecto"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Montaje"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Las partes pueden ser ensambladas desde otros componentes por defecto"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Componente"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Las partes pueden ser usadas como subcomponentes por defecto"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Comprable"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Las partes son comprables por defecto"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Vendible"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Las partes se pueden vender por defecto"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Rastreable"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Las partes son rastreables por defecto"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Virtual"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Las partes son virtuales por defecto"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Mostrar importación en vistas"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Mostrar el asistente de importación en algunas vistas de partes"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Mostrar partes relacionadas"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Mostrar partes relacionadas para una parte"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Datos iniciales de existencias"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Permitir la creación del stock inicial al añadir una nueva parte"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Datos iniciales del proveedor"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Permitir la creación de datos iniciales del proveedor al agregar una nueva parte"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Formato de visualización de Nombre de Parte"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Formato para mostrar el nombre de la parte"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Icono por defecto de la categoría de parte"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Icono por defecto de la categoría de parte (vacío significa que no hay icono)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr "Forzar unidades de parámetro"
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr "Si se proporcionan unidades, los valores de parámetro deben coincidir con las unidades especificadas"
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr "Mínimo de lugares decimales en el precio"
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr "Número mínimo de decimales a mostrar al procesar los datos de precios"
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr "Máximo de lugares decimales en el precio"
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr "Número máximo de decimales a mostrar al procesar los datos de precios"
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Usar precios de proveedor"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr "Incluir descuentos de precios del proveedor en los cálculos generales de precios"
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Anulación del historial de compra"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr "El precio histórico de compra anula los descuentos de precios del proveedor"
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Usar precio del artículo de almacén"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "Usar los precios de los datos de inventario introducidos manualmente para los cálculos de precios"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Edad del precio del artículo de almacén"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Excluir artículos de almacén anteriores a este número de días de los cálculos de precios"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr "Usar precios variantes"
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr "Incluir variantes de precios en los cálculos generales de precios"
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Solo variantes activas"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr "Usar solo partes de variantes activas para calcular los precios de variantes"
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr "Intervalo de reconstrucción de precios"
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr "Número de días antes de que el precio de la parte se actualice automáticamente"
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Precios internos"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "Habilitar precios internos para partes"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Anulación del precio interno"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr "Si está disponible, los precios internos anulan los cálculos del rango de precios"
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Habilitar impresión de etiquetas"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Habilitar impresión de etiquetas desde la interfaz web"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "PPP de la imagen de etiqueta"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr "Resolución DPI al generar archivos de imagen que suministrar para etiquetar complementos de impresión"
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Habilitar informes"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Habilitar generación de informes"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Modo de depuración"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Generar informes en modo de depuración (salida HTML)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+#, fuzzy
+#| msgid "No errors"
+msgid "Log Report Errors"
+msgstr "Sin errores"
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Tamaño de página"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Tamaño de página predeterminado para informes PDF"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Habilitar informes de prueba"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Habilitar generación de informes de prueba"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Adjuntar informes de prueba"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Al imprimir un informe de prueba, adjuntar una copia del informe de prueba al artículo de almacén asociado"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr "Seriales únicos globalmente"
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "Los números de serie para los artículos de inventario deben ser únicos globalmente"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Autollenar números de serie"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Autorellenar números de serie en formularios"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Eliminar existencias agotadas"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Determina el comportamiento predeterminado cuando un artículo de almacén es agotado"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr "Plantilla de código de lote"
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Plantilla para generar códigos de lote por defecto para artículos de almacén"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Expiración de stock"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "Habilitar la funcionalidad de expiración de stock"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "Vender existencias caducadas"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "Permitir venta de existencias caducadas"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Tiempo histórico de Stock"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Número de días de artículos de stock se consideran obsoletos antes de caducar"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Crear Stock Caducado"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Permitir crear con stock caducado"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "Control de Stock"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Habilitar control de propiedad sobre ubicaciones de stock y artículos"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr "Icono por defecto de ubicación de almacén"
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr "Icono por defecto de ubicación de almacén (vacío significa que no hay icono)"
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr "Mostrar Articulos de Stock Instalados"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr "Mostrar los artículos de stock instalados en las tablas de stock"
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Patrón de Referencia de Ordenes de Armado"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Patrón requerido para generar el campo de referencia de la Orden de Ensamblado"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr "Habilitar órdenes de devolución"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr "Habilitar la funcionalidad de orden de devolución en la interfaz de usuario"
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr "Patrón de referencia de orden de devolución"
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr "Patrón requerido para generar el campo de referencia de la orden de devolución"
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr "Editar ordenes de devolución completadas"
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr "Permitir la edición de ordenes de devolución después de que hayan sido completados"
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr "Patrón de Referencia de Ordenes de Venta"
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr "Patrón requerido para generar el campo de referencia de la orden de venta"
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr "Envío Predeterminado de Ordenes de Venta"
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr "Habilitar la creación de envío predeterminado con ordenes de entrega"
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr "Editar Ordenes de Venta Completados"
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr "Permitir la edición de ordenes de venta después de que hayan sido enviados o completados"
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr "Patrón de Referencia de Orden de Compra"
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr "Patrón requerido para generar el campo de referencia de la Orden de Compra"
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Editar Ordenes de Compra Completados"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr "Autocompletar Ordenes de compra"
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Habilitar función de contraseña olvidada"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Activar la función olvido de contraseña en las páginas de inicio de sesión"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Habilitar registro"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Activar auto-registro para usuarios en las páginas de inicio de sesión"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "Habilitar SSO"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "Habilitar SSO en las páginas de inicio de sesión"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "Habilitar registro SSO"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr "Activar autoregistro a través de SSO para usuarios en las páginas de inicio de sesión"
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Email requerido"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr "Requiere usuario para suministrar correo al registrarse"
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "Auto-rellenar usuarios SSO"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Rellenar automáticamente los datos de usuario de la cuenta SSO"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "Correo dos veces"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "Al registrarse pregunte dos veces a los usuarios por su correo"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Contraseña dos veces"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "Al registrarse, preguntar dos veces a los usuarios por su contraseña"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Dominios permitidos"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Grupo al registrarse"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr "Grupo al que se asignan nuevos usuarios al registrarse"
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Forzar MFA"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Los usuarios deben utilizar seguridad multifactor."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Comprobar complementos al iniciar"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr "Comprobar que todos los complementos están instalados en el arranque - habilitar en entornos de contenedores"
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "Habilitar integración de URL"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "Habilitar plugins para añadir rutas de URL"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr "Habilitar integración de navegación"
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr "Habilitar plugins para integrar en la navegación"
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "Habilitar integración de la aplicación"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "Habilitar plugins para añadir aplicaciones"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr "Habilitar integración de programación"
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Habilitar plugins para ejecutar tareas programadas"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr "Habilitar integración de eventos"
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr "Habilitar plugins para responder a eventos internos"
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr "Habilitar códigos de proyecto"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr "Habilitar códigos de proyecto para rastrear proyectos"
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr "Excluir Ubicaciones Externas"
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr "Intervalo de borrado de informe"
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr "Mostrar nombres completos de los usuarios"
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr "Mostrar nombres completos de usuarios en lugar de nombres de usuario"
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Tecla de ajustes (debe ser única - mayúsculas y minúsculas"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr "Ocultar partes inactivas"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr "Ocultar partes inactivas en los resultados mostrados en la página de inicio"
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Mostrar partes suscritas"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Mostrar las partes suscritas en la página principal"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Mostrar categorías suscritas"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Mostrar categorías de partes suscritas en la página de inicio"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Mostrar últimas partes"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Mostrar las últimas partes en la página de inicio"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Mostrar BOMs no validadas"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Mostrar BOMs que esperan validación en la página de inicio"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Mostrar cambios recientes de stock"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Mostrar artículos de stock recientemente modificados en la página de inicio"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Mostrar stock bajo"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Mostrar artículos de stock bajo en la página de inicio"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Mostrar stock agotado"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Mostrar artículos agotados en la página de inicio"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Mostrar stock necesario"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Mostrar artículos de stock necesarios para trabajos en la página de inicio"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Mostrar stock caducado"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Mostrar artículos de stock caducados en la página de inicio"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Mostrar stock obsoleto"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Mostrar artículos de stock obsoletos en la página de inicio"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Mostrar trabajos pendientes"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Mostrar trabajos pendientes en la página de inicio"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Mostrar trabajos vencidos"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Mostrar trabajos pendientes en la página de inicio"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr "Mostrar Órdenes de Compra Pendientes"
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr "Mostrar las OC destacadas en la página de inicio"
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Mostrar OC atrasadas"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr "Mostrar las OC vencidas en la página de inicio"
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr "Mostrar OV pendiemtes"
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr "Mostrar OV pendientes en la página de inicio"
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Mostrar OV atrasadas"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr "Mostrar OV atrasadas en la página de inicio"
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Mostrar novedades"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Mostrar las últimas novedades de InvenTree en la página de inicio"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "Mostrar etiqueta interior"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "Mostrar etiquetas PDF en el navegador, en lugar de descargar como un archivo"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr "Impresora predeterminada"
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr "Mostrar informe en línea"
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "Mostrar informes PDF en el navegador, en lugar de descargar como un archivo"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Buscar partes"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr "Buscar partes de proveedor"
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Buscar Partes del Fabricante"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Ocultar Partes Inactivas"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr "Excluir las partes inactivas de la ventana de previsualización de búsqueda"
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr "Buscar categorías"
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr "Mostrar categorias de la parte en la ventana de previsualización de búsqueda"
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Buscar inventario"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Mostrar artículos del stock en la ventana de previsualización de búsqueda"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Ocultar Artículos del Stock Agotados"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Excluir artículos de stock que no están disponibles en la ventana de previsualización de búsqueda"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Buscar ubicaciones"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr "Mostrar ubicaciones de almacén en la ventana de vista previa de búsqueda"
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Buscar empresas"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr "Mostrar empresas en la ventana de vista previa de búsqueda"
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Buscar Pedidos de Construcción"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Buscar órdenes de compra"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Excluir pedidos de compra inactivos"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Buscar órdenes de venta"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Buscar órdenes de devolución"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "Resultados de la vista previa"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Búsqueda usando una expresión regular"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr "Habilitar expresiones regulares en las consultas de búsqueda"
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr "Búsqueda por palabra completa"
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr "Las consultas de búsqueda devuelven resultados para palabras enteras coincidentes"
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Mostrar cantidad en formularios"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "Mostrar la cantidad de partes disponibles en algunos formularios"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr "Formularios de cierre de teclas de escape"
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr "Usa la clave de escape para cerrar formularios modales"
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Barra de navegación fija"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr "La posición de la barra de navegación se fija en la parte superior de la pantalla"
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Formato de Fecha"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Formato preferido para mostrar fechas"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Planificación de partes"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr "Recibir reportes de error"
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr "Últimas impresoras usadas"
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr "Cantidad de salto de precio"
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3518,23 @@ msgstr "Cantidad de salto de precio"
 msgid "Price"
 msgstr "Precio"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr "Precio unitario a la cantidad especificada"
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Endpoint"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr "Punto final en el que se recibe este webhook"
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr "Nombre para este webhook"
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3544,101 @@ msgstr "Nombre para este webhook"
 msgid "Active"
 msgstr "Activo"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr "Está activo este webhook"
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Token"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Token para el acceso"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Clave"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr "Secreto compartido para HMAC"
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "ID de mensaje"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr "Identificador único para este mensaje"
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Host"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr "Servidor desde el cual se recibió este mensaje"
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Encabezado"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "Encabezado del mensaje"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Cuerpo"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr "Cuerpo de este mensaje"
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr "Endpoint en el que se recibió este mensaje"
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr "Trabajado en"
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr "¿El trabajo en este mensaje ha terminado?"
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Id"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Título"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Publicado"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Autor"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Resumen"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Leer"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr "¿Esta noticia ya fue leída?"
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3648,31 @@ msgstr "¿Esta noticia ya fue leída?"
 msgid "Image"
 msgstr "Imágen"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "Archivo de imagen"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr "Nombre de unidad debe ser un identificador válido"
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr "Nombre de unidad"
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr "Símbolo"
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr "Símbolo de unidad opcional"
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr "Definición"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr "Definición de unidad"
 
@@ -3966,7 +3976,7 @@ msgid "Link to address information (external)"
 msgstr "Enlace a información de dirección (externa)"
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Parte base"
@@ -3977,7 +3987,7 @@ msgstr "Seleccionar parte"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4002,7 @@ msgid "Select manufacturer"
 msgstr "Seleccionar fabricante"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4048,7 @@ msgid "Parameter value"
 msgstr "Valor del parámetro"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4074,7 @@ msgstr "La parte vinculada del fabricante debe hacer referencia a la misma parte
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4091,7 @@ msgstr "Proveedor"
 msgid "Select supplier"
 msgstr "Seleccionar proveedor"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Unidad de mantenimiento de stock de proveedores"
 
@@ -4098,13 +4108,13 @@ msgid "Supplier part description"
 msgstr "Descripción de la parte del proveedor"
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Nota"
 
@@ -4117,7 +4127,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Cargo mínimo (p. ej., cuota de almacenamiento)"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4233,7 @@ msgstr "Borrar imagen"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4444,7 @@ msgstr "No hay información del fabricante disponible"
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4544,7 @@ msgid "No supplier information available"
 msgstr "No hay información de proveedor disponible"
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4594,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4657,7 @@ msgstr "Etiqueta"
 msgid "Label template file"
 msgstr "Archivo de plantilla de etiqueta"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4683,7 @@ msgstr "Altura [mm]"
 msgid "Label height, specified in mm"
 msgstr "Altura de la etiqueta, especificada en mm"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Patrón de Nombre de archivo"
 
@@ -4687,8 +4697,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Filtros"
 
@@ -4846,11 +4856,11 @@ msgstr "Orden de devolución"
 msgid "Total price for this order"
 msgstr "Precio total para este pedido"
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr "Moneda de pedido"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr "Moneda para este pedido (dejar en blanco para utilizar el valor predeterminado de la empresa)"
 
@@ -5037,7 +5047,7 @@ msgstr "Recibido"
 msgid "Number of items received"
 msgstr "Número de artículos recibidos"
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5102,8 @@ msgstr "Revisado por"
 msgid "User who checked this shipment"
 msgstr "Usuario que revisó este envío"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Envío"
 
@@ -5141,7 +5151,7 @@ msgstr "No se puede asignar stock a una línea sin una parte"
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "La cantidad de asignación no puede exceder la cantidad de stock"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "La cantidad debe ser 1 para el stock serializado"
 
@@ -5215,159 +5225,159 @@ msgstr "Salida para esta partida"
 msgid "Cost associated with return or repair for this line item"
 msgstr "Costo asociado con la devolución o reparación para esta partida"
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "El pedido no puede ser cancelado"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr "Permitir cerrar el pedido con partidas incompletas"
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr "El pedido tiene partidas incompletas"
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "El pedido no está abierto"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Moneda del precio de compra"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr "Debe especificar la parte del proveedor"
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr "La orden de compra debe especificarse"
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr "El proveedor debe coincidir con la orden de compra"
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr "La orden de compra debe coincidir con el proveedor"
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr "Partida"
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr "La partida no coincide con la orden de compra"
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr "Seleccione la ubicación de destino para los artículos recibidos"
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr "Introduzca el código de lote para los artículos de almacén entrantes"
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Introduzca números de serie para artículos de almacén entrantes"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Código de barras"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr "Código de barras escaneado"
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "Código de barras en uso"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Debe proporcionarse una cantidad entera para las partes rastreables"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr "Se deben proporcionar las partidas"
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr "Se requiere ubicación de destino"
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr "Los valores del código de barras deben ser únicos"
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr "Moneda del precio de venta"
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr "No se proporcionaron detalles de envío"
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr "La partida no está asociada con este pedido"
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr "La cantidad debe ser positiva"
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Introduzca números de serie para asignar"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr "El envío ya ha sido enviado"
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr "El envío no está asociado con este pedido"
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr "No se han encontrado coincidencias para los siguientes números de serie"
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr "Los siguientes números de serie ya están asignados"
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr "Partida de orden de devolución"
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr "La partida no coincide con la orden de devolución"
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr "La partida ya ha sido recibida"
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr "Los artículos sólo pueden ser recibidos contra pedidos en curso"
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr "Moneda de precio de línea"
 
@@ -5771,12 +5781,12 @@ msgstr "Actualizado el precio unitario de {part} a {price}"
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr "Actualizado el precio unitario de {part} a {price} y la cantidad a {qty}"
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "ID de Parte"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Nombre de parte"
@@ -5793,7 +5803,7 @@ msgid "IPN"
 msgstr "IPN"
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Revisión"
@@ -5869,8 +5879,8 @@ msgstr "Nombre del padre"
 msgid "Category Path"
 msgstr "Ruta de Categoría"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5903,17 @@ msgstr "ID de artículo de BOM"
 msgid "Parent IPN"
 msgstr "IPN del padre"
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr "IPN de la parte"
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr "Precio mínimo"
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5991,8 @@ msgstr "Validación de Lista de Materiales"
 msgid "This option must be selected"
 msgstr "Esta opción debe ser seleccionada"
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6009,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Ubicación Predeterminada"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Inventario Total"
@@ -6008,7 +6018,7 @@ msgstr "Inventario Total"
 msgid "Input quantity for price calculation"
 msgstr "Cantidad de entrada para el cálculo del precio"
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Categoría de parte"
@@ -6090,7 +6100,7 @@ msgstr "Parte con este nombre, IPN y revisión ya existe."
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr "¡No se pueden asignar partes a las categorías de partes estructurales!"
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Nombre de la parte"
 
@@ -6424,598 +6434,604 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr "Las plantillas de prueba sólo pueden ser creadas para partes rastreables"
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Test with this name already exists for this part"
+msgid "Test template with the same key already exists for part"
 msgstr "Ya existe una prueba con este nombre para esta parte"
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Nombre de prueba"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr "Introduzca un nombre para la prueba"
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Descripción de prueba"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr "Introduce la descripción para esta prueba"
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Requerido"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr "¿Es necesario pasar esta prueba?"
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Requiere valor"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr "¿Esta prueba requiere un valor al agregar un resultado de la prueba?"
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr "Adjunto obligatorio"
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr "¿Esta prueba requiere un archivo adjunto al agregar un resultado de la prueba?"
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr "El nombre de parámetro en la plantilla tiene que ser único"
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr "Nombre de Parámetro"
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr "Casilla de verificación"
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr "¿Es este parámetro una casilla de verificación?"
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr "Opciones"
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr "Opciones válidas para este parámetro (separados por comas)"
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr "Opción inválida para el valor del parámetro"
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr "Parte principal"
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Plantilla de parámetro"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Datos"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Valor del parámetro"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Valor predeterminado"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr "Valor de parámetro por defecto"
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr "ID de parte o nombre de parte"
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr "Valor de ID de parte única"
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr "Valor IPN de parte"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr "Nivel"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr "Nivel de BOM"
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr "Seleccionar parte principal"
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr "Sub parte"
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr "Seleccionar parte a utilizar en BOM"
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr "Cantidad del artículo en BOM"
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr "Este artículo BOM es opcional"
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr "Este artículo de BOM es consumible (no está rastreado en órdenes de construcción)"
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr "Exceso"
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Cantidad estimada de desperdicio de construcción (absoluta o porcentaje)"
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr "Referencia de artículo de BOM"
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr "Notas del artículo de BOM"
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr "Suma de verificación"
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr "Suma de verificación de línea de BOM"
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "Validado"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr "Este artículo de BOM ha sido validado"
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr "Este artículo BOM es heredado por BOMs para partes variantes"
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Permitir variantes"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr "Artículos de stock para partes variantes pueden ser usados para este artículo BOM"
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr "La cantidad debe ser un valor entero para las partes rastreables"
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr "Debe especificar la subparte"
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr "Ítem de BOM sustituto"
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr "La parte sustituta no puede ser la misma que la parte principal"
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr "Artículo BOM superior"
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr "Sustituir parte"
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr "Parte 1"
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr "Parte 2"
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr "Seleccionar parte relacionada"
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Subcategorías"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Moneda de compra de ítem de stock"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr "Parte original"
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr "Seleccione la parte original a duplicar"
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Copiar Imagen"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr "Copiar imagen desde la parte original"
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr "Copiar BOM"
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr "Copiar la factura de materiales de la parte original"
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Copiar Parámetros"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr "Copiar datos del parámetro de la parte original"
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr "Copiar Notas"
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr "Cantidad Inicial de Stock"
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr "Seleccione proveedor (o déjelo en blanco para saltar)"
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr "Seleccionar fabricante (o dejar en blanco para saltar)"
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr "Número de parte del fabricante"
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr "La empresa seleccionada no es un proveedor válido"
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr "La empresa seleccionada no es un fabricante válido"
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "Duplicar Parte"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr "Stock Inicial"
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr "Crear Parte con cantidad inicial de stock"
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr "Información del proveedor"
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr "Añadir información inicial del proveedor para esta parte"
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr "Copiar Parámetros de Categoría"
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr "Copiar plantillas de parámetro de la categoría de partes seleccionada"
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr "Imagen Existente"
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr "El archivo de imagen no existe"
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Generar informe"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr "Actualizar partes"
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr "Anular el valor calculado para precio mínimo"
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr "Precio mínimo de moneda"
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr "Precio máximo de moneda"
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr "Actualizar"
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr "El precio mínimo no debe ser mayor que el precio máximo"
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr "El precio máximo no debe ser inferior al precio mínimo"
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr "Seleccionar parte de la que copiar BOM"
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr "Eliminar Datos Existentes"
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr "Eliminar artículos BOM existentes antes de copiar"
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr "Incluye Heredado"
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr "Incluye artículos BOM que son heredados de partes con plantillas"
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr "Omitir filas no válidas"
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr "Activar esta opción para omitir filas inválidas"
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr "Copiar partes sustitutas"
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr "Limpiar BOM Existente"
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr "Varios resultados encontrados"
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr "No se encontraron partes coincidentes"
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr "La parte no está designada como componente"
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr "Cantidad no proporcionada"
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Cantidad no válida"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr "Se requiere al menos un artículo BOM"
 
@@ -8025,7 +8041,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8349,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "No se han proporcionado objetos válidos a la plantilla"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr "Informe de la prueba"
 
@@ -8362,103 +8378,115 @@ msgstr "Legal"
 msgid "Letter"
 msgstr "Carta"
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Nombre de la plantilla"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "Plantilla de informe"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr "Descripción de la plantilla de informe"
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr "Número de revisión del informe (autoincremental)"
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr "Tamaño de página para reportes PDF"
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr "Patrón para generar nombres de archivo"
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr "Plantilla de informe está habilitada"
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr "Filtros de consulta de Stock (lista separada por comas de pares clave=valor)"
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr "Incluye Pruebas Instaladas"
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr "Incluye resultados de prueba para artículos de stock instalados dentro del artículo ensamblado"
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr "Crear filtros"
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr "Crear filtros de consulta (lista separada por comas de pares clave=valor"
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Filtros de partes"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr "Filtros de búsqueda de partes (lista separada por comas de pares clave=valor"
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr "Filtros de búsqueda de orden de compra"
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr "Filtros de búsqueda de pedidos de ventas"
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr "Filtros de búsqueda de orden de devolución"
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Stock item with this serial number already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Ya existe un artículo de almacén con este número de serie"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Fragmento"
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr "Archivo fragmento de informe"
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr "Descripción de archivo de fragmento"
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Ya existe un archivo adjunto con este nombre"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr "Activo"
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr "Reportar archivo de activos"
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr "Descripción del archivo de activos"
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8793,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8838,7 @@ msgstr "Seleccione una parte del proveedor correspondiente para este artículo d
 msgid "Where is this stock item located?"
 msgstr "¿Dónde se encuentra este artículo de stock?"
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr "Empaquetar este artículo de stock se almacena en"
 
@@ -8822,7 +8850,7 @@ msgstr "¿Está este artículo instalado en otro artículo?"
 msgid "Serial number for this item"
 msgstr "Número de serie para este artículo"
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr "Código de lote para este artículo de stock"
 
@@ -8899,7 +8927,7 @@ msgstr "Los números de serie deben ser una lista de enteros"
 msgid "Quantity does not match serial numbers"
 msgstr "La cantidad no coincide con los números de serie"
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Números de serie ya existen"
 
@@ -8931,7 +8959,7 @@ msgstr "El artículo de stock está en producción"
 msgid "Serialized stock cannot be merged"
 msgstr "Stock serializado no puede ser combinado"
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr "Artículos de Stock Duplicados"
 
@@ -8979,184 +9007,184 @@ msgstr "Adjunto de resultados de prueba"
 msgid "Test notes"
 msgstr "Notas de prueba"
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr "El número de serie es demasiado grande"
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr "Introduzca el número de artículos de stock para serializar"
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr "La cantidad no debe exceder la cantidad disponible de stock ({q})"
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "Introduzca números de serie para nuevos artículos"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr "Ubicación de stock de destino"
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr "Campo de nota opcional"
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr "Los números de serie no se pueden asignar a esta parte"
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr "Añadir nota de transacción (opcional)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Sub-ubicación"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr "La parte debe ser vendible"
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr "El artículo está asignado a una orden de venta"
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr "El artículo está asignado a una orden de creación"
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr "Cliente para asignar artículos de stock"
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr "La empresa seleccionada no es un cliente"
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr "Notas de asignación de stock"
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr "Debe proporcionarse una lista de artículos de stock"
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr "Notas de fusión de stock"
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr "Permitir proveedores no coincidentes"
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr "Permitir fusionar artículos de stock con diferentes partes de proveedor"
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr "Permitir estado no coincidente"
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr "Permitir fusionar artículos de stock con diferentes códigos de estado"
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr "Debe proporcionar al menos dos artículos de stock"
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr "Valor de clave primaria de Stock"
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr "Notas de transacción de stock"
 
@@ -14083,4 +14111,3 @@ msgstr "Permisos para editar artículos"
 #: users/models.py:413
 msgid "Permission to delete items"
 msgstr "Permiso para eliminar artículos"
-
diff --git a/InvenTree/locale/es_MX/LC_MESSAGES/django.po b/InvenTree/locale/es_MX/LC_MESSAGES/django.po
index 7d787a623453..93d66b18fe26 100644
--- a/InvenTree/locale/es_MX/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es_MX/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -31,20 +31,20 @@ msgstr ""
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr ""
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -66,9 +66,9 @@ msgstr ""
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -133,42 +133,42 @@ msgstr ""
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr ""
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr ""
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr ""
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr ""
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr ""
 
@@ -402,7 +402,7 @@ msgstr ""
 msgid "Select file to attach"
 msgstr ""
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -433,9 +433,9 @@ msgstr ""
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -480,10 +480,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr ""
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -507,10 +507,10 @@ msgstr ""
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -582,7 +582,7 @@ msgstr ""
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr ""
 
@@ -679,7 +679,7 @@ msgstr ""
 msgid "Downloading images from remote URL is not enabled"
 msgstr ""
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -939,14 +939,14 @@ msgstr ""
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1015,7 +1015,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1047,9 +1047,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1060,7 +1060,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1147,8 +1147,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1265,9 +1265,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1286,10 +1286,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1299,7 +1299,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1360,9 +1360,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1426,8 +1426,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1452,10 +1452,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,8 +1494,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1567,7 +1567,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1603,11 +1603,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1620,7 +1620,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1660,7 +1660,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1670,7 +1670,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1678,13 +1678,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2118,1390 +2118,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3509,23 +3517,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3535,101 +3543,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3639,31 +3647,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3967,7 +3975,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3978,7 +3986,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3993,7 +4001,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4039,7 +4047,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4065,7 +4073,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4082,7 +4090,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4099,13 +4107,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4118,7 +4126,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4224,7 +4232,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4435,7 +4443,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4535,7 +4543,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4585,10 +4593,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4648,7 +4656,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4674,7 +4682,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4688,8 +4696,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4847,11 +4855,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5038,7 +5046,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5093,8 +5101,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5142,7 +5150,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5216,159 +5224,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5772,12 +5780,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5794,7 +5802,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5870,8 +5878,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5894,17 +5902,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5982,8 +5990,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -6000,7 +6008,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6009,7 +6017,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6091,7 +6099,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6425,598 +6433,602 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+msgid "Test template with the same key already exists for part"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8026,7 +8038,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8334,16 +8346,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8363,103 +8375,111 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+msgid "Snippet file with this name already exists"
+msgstr ""
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+msgid "Asset file with this name already exists"
+msgstr ""
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8766,7 +8786,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8811,7 +8831,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8823,7 +8843,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8900,7 +8920,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8932,7 +8952,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8980,184 +9000,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/fa/LC_MESSAGES/django.po b/InvenTree/locale/fa/LC_MESSAGES/django.po
index db05fa6d7ce0..5993403779f3 100644
--- a/InvenTree/locale/fa/LC_MESSAGES/django.po
+++ b/InvenTree/locale/fa/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Persian\n"
@@ -30,20 +30,20 @@ msgstr "کاربر سطح دسترسی نمایش این مدل را ندارد"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "مقداری افزوده نشده"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "تعداد افزوده شده اشتباه است"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr "تاریخ را وارد کنید"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "دامنه ایمیل ارائه شده تایید نشده است."
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr ""
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr ""
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr ""
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr ""
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr ""
 
@@ -401,7 +401,7 @@ msgstr ""
 msgid "Select file to attach"
 msgstr ""
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr ""
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr ""
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr ""
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr ""
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr ""
 
@@ -678,7 +678,7 @@ msgstr "آدرس فایل تصویری از راه دور"
 msgid "Downloading images from remote URL is not enabled"
 msgstr ""
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -938,14 +938,14 @@ msgstr ""
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,598 +6432,602 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+msgid "Test template with the same key already exists for part"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8037,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8345,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8362,103 +8374,111 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+msgid "Snippet file with this name already exists"
+msgstr ""
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+msgid "Asset file with this name already exists"
+msgstr ""
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8785,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8830,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8822,7 +8842,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8899,7 +8919,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8931,7 +8951,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8979,184 +8999,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/fi/LC_MESSAGES/django.po b/InvenTree/locale/fi/LC_MESSAGES/django.po
index 1e1a2acb2f15..4cd096c6b56f 100644
--- a/InvenTree/locale/fi/LC_MESSAGES/django.po
+++ b/InvenTree/locale/fi/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Finnish\n"
@@ -30,20 +30,20 @@ msgstr "Käyttäjän oikeudet eivät riitä kohteen tarkastelemiseen"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Arvoa ei annettu"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr "Anna päivämäärä"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Annetun sähköpostiosoitteen verkkotunnusta ei hyväksytä."
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Annettu määrä on virheellinen"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Tyhjä sarjanumero"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Duplikaatti sarjanumero"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Sarjanumeroita ei löytynyt"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr ""
 
@@ -401,7 +401,7 @@ msgstr "Liite"
 msgid "Select file to attach"
 msgstr "Valitse liitettävä tiedosto"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Kommentti"
 msgid "File comment"
 msgstr "Tiedoston kommentti"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr "Virheellinen valinta"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Nimi"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Palvelinvirhe"
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Täytyy olla kelvollinen luku"
 
@@ -678,7 +678,7 @@ msgstr "Kuvatiedoston URL"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Kuvien lataaminen ei ole käytössä"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -938,14 +938,14 @@ msgstr "Tietoja InvenTree:stä"
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Sarjanumerot"
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Ei ryhmää"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Verkkotunnus ei saa olla tyhjä."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Virheellinen verkkotunnus: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Uudelleenkäynnistys vaaditaan"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Yrityksen nimi"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Yrityksen sisäinen nimi"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Oletusvaluutta"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "päivää"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Automaattinen varmuuskopionti"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Ota käyttöön tietokannan ja mediatiedostojen automaattinen varmuuskopiointi"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Automaattisen varmuuskopioinnin aikaväli"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Viivakoodituki"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Komponentti"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Ostettavissa"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Seurattavissa"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Sisäiset hinnat"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Sisäisen hinnan ohitus"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Sivun koko"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Täytä sarjanumerot automaattisesti"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Salli salasananpalautus"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Salli rekisteröinti"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "Salli SSO"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "Salli SSO kirjautumissivuilla"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "Salli SSO rekisteröinti"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Sähköposti vaaditaan"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "Sähköpostiosoite kahdesti"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Salasana kahdesti"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Sallitut verkkotunnukset"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Pakota MFA"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Näytä uutiset"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Näytä uutiset kotisivulla"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr "Hinta"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr "Aktiivinen"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Salaisuus"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Isäntä"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Otsikko"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Julkaistu"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Julkaisija"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Yhteenveto"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr "Kuva"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "Kuvatiedosto"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Valitse valmistaja"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "Toimittaja"
 msgid "Select supplier"
 msgstr "Valitse toimittaja"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Toimittajan varastonimike"
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Muistiinpano"
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "Korkeus [mm]"
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Suodattimet"
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr "Tilauksen valuutta"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr "Vastaanotettu"
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Viivakoodi"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,600 +6432,606 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Samanniminen liite on jo olemassa"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr "Valmistajan osanumero"
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "Ulkoinen linkki"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Luo raportti"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8027,7 +8041,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8335,16 +8349,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8364,103 +8378,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Samanniminen liite on jo olemassa"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Samanniminen liite on jo olemassa"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8767,7 +8793,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8812,7 +8838,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8824,7 +8850,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8901,7 +8927,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8933,7 +8959,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8981,184 +9007,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/fr/LC_MESSAGES/django.po b/InvenTree/locale/fr/LC_MESSAGES/django.po
index 92767189829f..8fde423a5380 100644
--- a/InvenTree/locale/fr/LC_MESSAGES/django.po
+++ b/InvenTree/locale/fr/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: French\n"
@@ -30,20 +30,20 @@ msgstr "L'utilisateur n'a pas la permission de voir ce modèle"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Pas de valeur renseignée"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Impossible de convertir {original} en {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Quantité fournie invalide"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Quantité fournie invalide ({exc})"
@@ -65,9 +65,9 @@ msgstr "Entrer la date"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Le domaine e-mail fourni n'est pas approuvé."
 msgid "Registration is disabled."
 msgstr "L'enregistrement est désactivé."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Quantité fournie invalide"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Chaîne de numéro de série vide"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Numéro de série en doublon"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Plage de groupe non valide : {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "La plage de groupe {group} dépasse la quantité autorisée ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Séquence de groupe invalide : {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Aucun numéro de série trouvé"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Le nombre de numéros de série uniques ({len(serials)}) doit correspondre à la quantité ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Retirer les balises HTML de cette valeur"
 
@@ -401,7 +401,7 @@ msgstr "Pièce jointe"
 msgid "Select file to attach"
 msgstr "Sélectionnez un fichier à joindre"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Commentaire"
 msgid "File comment"
 msgstr "Commentaire du fichier"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Les noms dupliqués ne peuvent pas exister sous le même parent"
 msgid "Invalid choice"
 msgstr "Choix invalide"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Nom"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Erreur serveur"
 msgid "An error has been logged by the server."
 msgstr "Une erreur a été loguée par le serveur."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Doit être un nombre valide"
 
@@ -678,7 +678,7 @@ msgstr "URL du fichier image distant"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Le téléchargement des images depuis une URL distante n'est pas activé"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Échec de la vérification du processus d'arrière-plan"
 
@@ -938,14 +938,14 @@ msgstr "À propos d'InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "La construction doit être annulée avant de pouvoir être supprimée"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Consommable"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Référence de l' Ordre de Fabrication"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "BuildOrder associé a cette fabrication"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "BuildOrder associé a cette fabrication"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "État de la construction"
 msgid "Build status code"
 msgstr "Code de statut de construction"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Code de lot"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "L'ordre de production de correspond pas à l'ordre de commande"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "La quantité doit être supérieure à zéro"
 
@@ -1285,10 +1285,10 @@ msgstr "Création de l'objet"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Création de l'objet"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "La quantité doit être de 1 pour stock sérialisé"
 msgid "Selected stock item does not match BOM line"
 msgstr "L'article de stock sélectionné ne correspond pas à la ligne BOM"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Quantité entière requise pour les pièces à suivre"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Quantité entière requise, car la facture de matériaux contient des pièces à puce"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Numéros de série"
@@ -1451,10 +1451,10 @@ msgstr "Les numéros de série suivants existent déjà, ou sont invalides"
 msgid "A list of build outputs must be provided"
 msgstr "Une liste d'ordre de production doit être fourni"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Emplacement des ordres de production achevés"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Accepter les articles de stock qui n'ont pas été complètement alloué
 msgid "Required stock has not been fully allocated"
 msgstr "Le stock requis n'a pas encore été totalement alloué"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Accepter les incomplèts"
 
@@ -1602,11 +1602,11 @@ msgstr "Élément de la ligne de construction"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part doit pointer sur la même pièce que l'ordre de construction"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "L'article doit être en stock"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Quantité disponible ({q}) dépassée"
@@ -1619,7 +1619,7 @@ msgstr "La sortie de construction doit être spécifiée pour l'allocation des p
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "La sortie de la construction ne peut pas être spécifiée pour l'allocation des pièces non suivies"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Les articles d'allocation doivent être fournis"
 
@@ -1659,7 +1659,7 @@ msgstr "Objets Optionnels"
 msgid "Allocate optional BOM items to build order"
 msgstr "Affecter des éléments de nomenclature facultatifs à l'ordre de fabrication"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Article du BOM"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr "En Commande"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr "Description du projet"
 msgid "User or group responsible for this project"
 msgstr "Utilisateur ou groupe responsable de ce projet"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Clé du paramètre (doit être unique - insensible à la casse)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Valeur du paramètre"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "La valeur choisie n'est pas une option valide"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "La valeur doit être une valeur booléenne"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "La valeur doit être un nombre entier"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "La chaîne de caractères constituant la clé doit être unique"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Pas de groupe"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Un domaine vide n'est pas autorisé."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Nom de domaine invalide : {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Pas de plugin"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Redémarrage nécessaire"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "Un paramètre a été modifié, ce qui nécessite un redémarrage du serveur"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Migration en attente"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr "Nombre de migrations de base de données en attente"
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Nom de l'instance du serveur"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "Chaîne de caractères descriptive pour l'instance serveur"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Utiliser le nom de l'instance"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Utiliser le nom de l’instance dans la barre de titre"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Limiter l'affichage de `about`"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Afficher la modale `about` uniquement aux super-utilisateurs"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Nom de la société"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Nom de société interne"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "URL de base"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "URL de base pour l'instance serveur"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Devise par défaut"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr "Sélectionnez la devise de base pour les calculs de prix"
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr "Intervalle de mise à jour des devises"
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr "Fréquence de mise à jour des taux de change (définir à zéro pour désactiver)"
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "jours"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr "Plugin de mise à jour de devise"
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr "Plugin de mise à jour des devises à utiliser"
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Télécharger depuis l'URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Autoriser le téléchargement d'images distantes et de fichiers à partir d'URLs externes"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Limite du volume de téléchargement"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Taille maximale autorisée pour le téléchargement de l'image distante"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "Agent utilisateur utilisé pour télécharger depuis l'URL"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "Permettre de remplacer l'agent utilisateur utilisé pour télécharger des images et des fichiers à partir d'URL externe (laisser vide pour la valeur par défaut)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr "Validation stricte d'URL"
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr "Spécification du schéma nécessaire lors de la validation des URL"
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Confirmation requise"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Exiger une confirmation explicite de l’utilisateur pour certaines actions."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Profondeur de l'arborescence"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Profondeur de l'arborescence par défaut. Les niveaux plus profonds peuvent être chargés au fur et à mesure qu'ils sont nécessaires."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Intervalle de vérification des mises à jour"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "À quelle fréquence vérifier les mises à jour (définir à zéro pour désactiver)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Backup automatique"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Activer le backup automatique de la base de données et des fichiers médias"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Intervalle de sauvegarde automatique"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Spécifiez le nombre de jours entre les sauvegardes automatique"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Intervalle de suppression des tâches"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "Les résultats de la tâche en arrière-plan seront supprimés après le nombre de jours spécifié"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr "Intervalle de suppression du journal d'erreur"
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "Les logs d'erreur seront supprimés après le nombre de jours spécifié"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr "Intervalle de suppression du journal de notification"
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Les notifications de l'utilisateur seront supprimées après le nombre de jours spécifié"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Support des code-barres"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr "Activer le support du scanner de codes-barres dans l'interface web"
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Délai d'entrée du code-barres"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Délai de traitement du code-barres"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Prise en charge de la webcam code-barres"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Autoriser la numérisation de codes-barres via la webcam dans le navigateur"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr "Modifications de la pièce"
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr "Activer le champ de modification de la pièce"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "Regex IPN"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Expression régulière pour la correspondance avec l'IPN de la Pièce"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Autoriser les IPN dupliqués"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Permettre à plusieurs pièces de partager le même IPN"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Autoriser l'édition de l'IPN"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Permettre de modifier la valeur de l'IPN lors de l'édition d'une pièce"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Copier les données de la pièce"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Copier les données des paramètres par défaut lors de la duplication d'une pièce"
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Copier les données des paramètres de la pièce"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Copier les données des paramètres par défaut lors de la duplication d'une pièce"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Copier les données de test de la pièce"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Copier les données de test par défaut lors de la duplication d'une pièce"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Copier les templates de paramètres de catégorie"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Copier les templates de paramètres de la catégorie lors de la création d'une pièce"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Modèle"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Les pièces sont des templates par défaut"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Assemblage"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Les pièces peuvent être assemblées à partir d'autres composants par défaut"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Composant"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Les pièces peuvent être utilisées comme sous-composants par défaut"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Achetable"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Les pièces sont achetables par défaut"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Vendable"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Les pièces sont vendables par défaut"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Traçable"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Les pièces sont traçables par défaut"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Virtuelle"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Les pièces sont virtuelles par défaut"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Afficher l'import dans les vues"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Afficher l'assistant d'importation pour certaine vues de produits"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Afficher les pièces connexes"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Afficher les pièces connexes à une pièce"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Stock initial"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Permettre la création d'un stock initial lors de l'ajout d'une nouvelle pièce"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Données initiales du fournisseur"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Permettre la création des données initiales du fournisseur lors de l'ajout d'une nouvelle pièce"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Format d'affichage du nom de la pièce"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Format pour afficher le nom de la pièce"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Icône de catégorie par défaut"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Icône par défaut de la catégorie de la pièce (vide signifie aucune icône)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr "Renforcer les unités des paramètres"
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Utiliser le prix fournisseur"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr "Inclure les réductions de prix dans le calcul du prix global"
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Remplacer l'historique des achats"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr "La tarification historique des bons de commande remplace les réductions de prix des fournisseurs"
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Utiliser les prix des articles en stock"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "Utiliser les prix des données de stock saisies manuellement pour calculer les prix"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Âge de tarification des articles de stock"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Exclure les articles en stock datant de plus de ce nombre de jours des calculs de prix"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr "Utiliser les prix variants"
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr "Inclure la tarification variante dans le calcul global des prix"
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Variantes actives uniquement"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr "N'utiliser que des pièces de variante actives pour calculer le prix de la variante"
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr "Intervalle de regénération des prix"
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr "Nombre de jours avant la mise à jour automatique du prix de la pièce"
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Prix internes"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "Activer les prix internes pour les pièces"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Substitution du prix interne"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr "Si disponible, les prix internes remplacent les calculs de la fourchette de prix"
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Activer l'impression d'étiquettes"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Activer l'impression d'étiquettes depuis l'interface Web"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "Étiquette image DPI"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr "Résolution DPI lors de la génération de fichiers image pour fournir aux plugins d'impression d'étiquettes"
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Activer les rapports"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Activer la génération de rapports"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Mode Débogage"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Générer des rapports en mode debug (sortie HTML)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Taille de la page"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Taille de page par défaut pour les rapports PDF"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Activer les rapports de test"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Activer la génération de rapports de test"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Joindre des rapports de test"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Lors de l'impression d'un rapport de test, joignez une copie du rapport de test à l'article en stock associé"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr "Numéro de Série Universellement Unique"
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "Les numéros de série pour les articles en stock doivent être uniques au niveau global"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Remplir automatiquement les Numéros de Série"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Remplir automatiquement les numéros de série dans les formulaires"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Supprimer le stock épuisé"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Détermine le comportement par défaut lorsqu'un article de stock est épuisé"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr "Modèle de code de lot"
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Modèle pour générer des codes par défaut pour les articles en stock"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Expiration du stock"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "Activer la fonctionnalité d'expiration du stock"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "Vendre le stock expiré"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "Autoriser la vente de stock expiré"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Délai de péremption du stock"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Nombre de jours pendant lesquels les articles en stock sont considérés comme périmés avant d'expirer"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Construction de stock expirée"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Autoriser la construction avec un stock expiré"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "Contrôle de la propriété des stocks"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Activer le contrôle de la propriété sur les emplacements de stock et les articles"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr "Icône par défaut de l'emplacement du stock"
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr "Icône par défaut de l'emplacement du stock (vide signifie aucune icône)"
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr "Afficher les pièces en stock installées"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Modèle de référence de commande de construction"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Modèle requis pour générer le champ de référence de l'ordre de construction"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr "Activer les retours de commandes"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr "Activer la fonctionnalité de retour de commande dans l'interface utilisateur"
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr "Modèle de référence de retour de commande"
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr "Modèle requis pour générer le champ de référence du retour de commande"
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr "Modifier les retours de commandes terminées"
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr "Autoriser la modification des retours après leur enregistrement"
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr "Modèle de référence de bon de commande"
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr "Modèle requis pour générer le champ de référence du bon de commande"
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr "Expédition par défaut du bon de commande"
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr "Activer la création d'expédition par défaut avec les bons de commandes"
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr "Modifier les commandes de vente terminées"
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr "Autoriser la modification des commandes de vente après avoir été expédiées ou complétées"
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr "Modèle de référence de commande d'achat"
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr "Modèle requis pour générer le champ de référence de bon de commande"
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Modifier les bons de commande terminés"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr "Autoriser la modification des bons de commande après avoir été expédiés ou complétés"
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Activer les mots de passe oubliés"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Activer la fonction \"Mot de passe oublié\" sur les pages de connexion"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Activer les inscriptions"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Activer l'auto-inscription pour les utilisateurs sur les pages de connexion"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "Activer le SSO"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "Activer le SSO sur les pages de connexion"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "Activer l'inscription SSO"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr "Activer l'auto-inscription via SSO pour les utilisateurs sur les pages de connexion"
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Email requis"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr "Exiger que l'utilisateur fournisse un mail lors de l'inscription"
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "Saisie automatique des utilisateurs SSO"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Remplir automatiquement les détails de l'utilisateur à partir des données de compte SSO"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "Courriel en double"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "Lors de l'inscription, demandez deux fois aux utilisateurs leur mail"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Mot de passe deux fois"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "Lors de l'inscription, demandez deux fois aux utilisateurs leur mot de passe"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Domaines autorisés"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Grouper sur inscription"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr "Groupe auquel les nouveaux utilisateurs sont assignés lors de l'inscription"
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Forcer l'authentification multifacteurs"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Les utilisateurs doivent utiliser l'authentification multifacteurs."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Vérifier les plugins au démarrage"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr "Vérifier que tous les plugins sont installés au démarrage - activer dans les environnements conteneurs"
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "Activer l'intégration d'URL"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "Autoriser les plugins à ajouter des chemins URL"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr "Activer l'intégration de navigation"
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr "Activer les plugins à s'intégrer dans la navigation"
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "Activer l'intégration de plugins"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "Activer l'intégration de plugin pour ajouter des apps"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr "Activer l'intégration du planning"
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Autoriser les plugins à éxécuter des tâches planifiées"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr "Activer l'intégration des évènements"
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr "Autoriser les plugins à répondre aux évènements internes"
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr "Activer les codes projet"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr "Fonctionnalité d'inventaire"
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr "Activer la fonctionnalité d'inventaire pour enregistrer les niveaux de stock et le calcul de la valeur du stock"
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr "Période de l'inventaire automatique"
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr "Nombre de jours entre l'enregistrement automatique des stocks (définir à zéro pour désactiver)"
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr "Les rapports d'inventaire seront supprimés après le nombre de jours spécifié"
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Clé du paramètre (doit être unique - insensible à la casse)"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Afficher les composants suivis"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Afficher les composants suivis sur l'écran d'accueil"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Afficher les catégories suivies"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Afficher les catégories de pièces suivies sur la page d'accueil"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Afficher les dernières pièces"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Afficher les derniers composants sur la page d'accueil"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Afficher les listes de matériaux non validées"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Afficher les listes de matériaux en attente de validation sur la page d'accueil"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Afficher les dernières modifications du stock"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Afficher les articles de stock récemment modifiés sur la page d'accueil"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Afficher le stock faible"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Afficher les articles en stock bas sur la page d'accueil"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Afficher le stock épuisé"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Afficher les stocks épuisés sur la page d'accueil"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Afficher le stock nécessaire"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Afficher les pièces en stock nécessaires pour les assemblages sur la page d'accueil"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Afficher le stock expiré"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Afficher les pièces en stock expirées sur la page d'accueil"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Afficher le stock périmé"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Afficher les articles de stock périmés sur la page d'accueil"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Afficher les constructions en attente"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Afficher les constructions en attente sur la page d'accueil"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Afficher les constructions en retard"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Afficher les constructions en retard sur la page d'accueil"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr "Afficher les commandes en suspens"
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr "Afficher les commandes en suspens sur la page d'accueil"
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Afficher les commandes en retard"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr "Afficher les commandes en retard sur la page d'accueil"
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr "Afficher les envois en suspens"
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr "Afficher les envois en suspens sur la page d'accueil"
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Afficher les envois en retard"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr "Afficher les envois en retard sur la page d'accueil"
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Afficher les nouvelles"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Afficher les nouvelles sur la page d'accueil"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "Affichage du libellé en ligne"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "Afficher les étiquettes PDF dans le navigateur, au lieu de les télécharger en tant que fichier"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr "Imprimante d'étiquettes par défaut"
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr "Configurer quelle imprimante d'étiquette doit être sélectionnée par défaut"
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr "Affichage du rapport en ligne"
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "Afficher les rapports PDF dans le navigateur, au lieu de les télécharger en tant que fichier"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Rechercher de pièces"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr "Afficher les pièces dans la fenêtre d'aperçu de la recherche"
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr "Afficher les pièces du fournisseur dans la fenêtre de prévisualisation de la recherche"
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Rechercher les pièces du fabricant"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr "Afficher les pièces du fabricant dans la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Masquer les pièces inactives"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr "Exclure les pièces inactives de la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr "Rechercher des catégories"
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr "Afficher les catégories de pièces dans la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Rechercher dans le stock"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Afficher les pièces en stock dans la fenêtre d'aperçu de la recherche"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Cacher les pièces indisponibles"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Exclure les articles en stock qui ne sont pas disponibles de la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Chercher des Emplacements"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr "Afficher les emplacements dans la fenêtre d'aperçu de la recherche"
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Rechercher les entreprises"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr "Afficher les entreprises dans la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Rechercher les commandes de construction"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr "Afficher les commandes de construction dans la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Rechercher des bons de commande"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr "Afficher les bons de commande dans la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Exclure les bons de commande inactifs"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr "Exclure les commandes d’achat inactives de la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Rechercher les bons de commande"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr "Afficher les bons de commande dans la fenêtre de prévisualisation de la recherche"
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr "Exclure les bons de commande inactives"
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr "Exclure les bons de commande inactifs de la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Rechercher les commandes retournées"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "Résultats de l'aperçu de la recherche"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr "Nombre de résultats à afficher dans chaque section de la fenêtre de prévisualisation de recherche"
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Recherche Regex"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Afficher la quantité dans les formulaires"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "Afficher la quantité disponible dans certains formulaires"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr "La touche Echap ferme les formulaires"
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr "Utilisez la touche Echap pour fermer les formulaires modaux"
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Barre de navigation fixe"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr "La position de la barre de navigation est fixée en haut de l'écran"
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Format de date"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Format préféré pour l'affichage des dates"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Planification des pièces"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr "Afficher les informations de planification des pièces"
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr "Inventaire des pièces"
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr "Longueur de la chaîne dans les Tableau"
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr "Prix"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr "Actif"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr "Ce webhook (lien de rappel HTTP) est-il actif"
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Jeton"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Jeton d'accès"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Confidentiel"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "ID message"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr "Identifiant unique pour ce message"
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Hôte"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr "Hôte à partir duquel ce message a été reçu"
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Entête"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "En-tête de ce message"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Corps"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr "Corps de ce message"
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr "Endpoint à partir duquel ce message a été reçu"
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr "Le travail sur ce message est-il terminé ?"
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Id"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Titre"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Publié"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Auteur"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Résumé"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Lu"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr "Cette nouvelle a-t-elle été lue ?"
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr "Cette nouvelle a-t-elle été lue ?"
 msgid "Image"
 msgstr "Image"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr "Définition"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Sélectionner un fabricant"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr "Valeur du paramètre"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr "La pièce du fabricant liée doit faire référence à la même pièce d
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "Fournisseur"
 msgid "Select supplier"
 msgstr "Sélectionner un fournisseur"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Unité de gestion des stocks des fournisseurs"
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr "Description de la pièce du fournisseur"
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Note"
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Frais minimums (par exemple frais de stock)"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr "Supprimer image"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr "Aucune information sur le fabricant disponible"
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr "Aucune information de fournisseur disponible"
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr "Étiquette"
 msgid "Label template file"
 msgstr "Fichier de modèle d'étiquette"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "Hauteur [mm]"
 msgid "Label height, specified in mm"
 msgstr "Hauteur de l'étiquette, spécifiée en mm"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Modèle de nom de fichier"
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Filtres"
 
@@ -4846,11 +4854,11 @@ msgstr "Retour de commande"
 msgid "Total price for this order"
 msgstr "Prix total pour cette commande"
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr "Devise de la commande"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr "Reçu"
 msgid "Number of items received"
 msgstr "Nombre d'éléments reçus"
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr "Vérifié par"
 msgid "User who checked this shipment"
 msgstr "Utilisateur qui a vérifié cet envoi"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Envoi"
 
@@ -5141,7 +5149,7 @@ msgstr "Impossible d'allouer le stock à une ligne sans pièce"
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "La quantité d'allocation ne peut pas excéder la quantité en stock"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "La commande ne peut pas être annulée"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "La commande n'est pas ouverte"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Devise du prix d'achat"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Entrez les numéros de série pour les articles de stock entrants"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Code-barres"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "Le code-barres est déjà utilisé"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Une quantité entière doit être fournie pour les pièces tracables"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Entrez les numéros de série à allouer"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr "Aucune correspondance trouvée pour les numéros de série suivants"
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr "Les numéros de série suivants sont déjà alloués"
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "ID de composant"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Nom de l'article"
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr "IPN"
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Révision"
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr "Prix Minimum"
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Catégorie de composant"
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Nom de l'article"
 
@@ -6424,604 +6432,610 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Une pièce jointe avec ce nom de fichier existe déjà"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Nom de test"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Requis"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Valeur requise"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Données"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Valeur par Défaut"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr "Surplus"
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "Validée"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Devise d'achat de l'item"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Copier l'image"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Copier les paramètres"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "Lien Externe"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Deallocate Stock"
 msgid "Unallocated Stock"
 msgstr "Désallouer le Stock"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 #, fuzzy
 #| msgid "Part Stocktake"
 msgid "Variant Stock"
 msgstr "Inventaire des pièces"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8031,7 +8045,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8339,16 +8353,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "Aucun objet valide n'a été fourni au modèle"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8368,103 +8382,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Nom du modèle"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Filtres de composants"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Une pièce jointe avec ce nom de fichier existe déjà"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Extrait "
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Une pièce jointe avec ce nom de fichier existe déjà"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr "Elément"
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8771,7 +8797,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8816,7 +8842,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8828,7 +8854,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr "Numéro de série pour cet article"
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8905,7 +8931,7 @@ msgstr "Les numéros de série doivent être une liste de nombres entiers"
 msgid "Quantity does not match serial numbers"
 msgstr "La quantité ne correspond pas au nombre de numéros de série"
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Les numéros de série existent déjà"
 
@@ -8937,7 +8963,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8985,184 +9011,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr "Entrez le nombre d'articles en stock à sérialiser"
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "Entrez les numéros de série pour les nouveaux articles"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr "Les numéros de série ne peuvent pas être assignés à cette pièce"
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/he/LC_MESSAGES/django.po b/InvenTree/locale/he/LC_MESSAGES/django.po
index 5ee21f0b8c4d..4facafce92ec 100644
--- a/InvenTree/locale/he/LC_MESSAGES/django.po
+++ b/InvenTree/locale/he/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Hebrew\n"
@@ -30,20 +30,20 @@ msgstr ""
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr ""
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr "הזן תאריך סיום"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr ""
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr ""
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr ""
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr ""
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "מספרים סידוריים לא נמצאו"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr ""
 
@@ -401,7 +401,7 @@ msgstr "קובץ מצורף"
 msgid "Select file to attach"
 msgstr "בחר קובץ לצירוף"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "הערה"
 msgid "File comment"
 msgstr "הערת קובץ"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr "בחירה שגויה"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "שם"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr ""
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "המספר חייב להיות תקין"
 
@@ -678,7 +678,7 @@ msgstr ""
 msgid "Downloading images from remote URL is not enabled"
 msgstr ""
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -938,14 +938,14 @@ msgstr ""
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "מספרים סידוריים"
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,598 +6432,602 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+msgid "Test template with the same key already exists for part"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8037,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8345,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8362,103 +8374,111 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+msgid "Snippet file with this name already exists"
+msgstr ""
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+msgid "Asset file with this name already exists"
+msgstr ""
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8785,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8830,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8822,7 +8842,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8899,7 +8919,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8931,7 +8951,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8979,184 +8999,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/hi/LC_MESSAGES/django.po b/InvenTree/locale/hi/LC_MESSAGES/django.po
index fa9044a7f60f..0441e72f716e 100644
--- a/InvenTree/locale/hi/LC_MESSAGES/django.po
+++ b/InvenTree/locale/hi/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Hindi\n"
@@ -30,20 +30,20 @@ msgstr ""
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr ""
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr "तारीख दर्ज करें"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr ""
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr ""
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr ""
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr ""
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr ""
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr ""
 
@@ -401,7 +401,7 @@ msgstr ""
 msgid "Select file to attach"
 msgstr ""
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr ""
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr ""
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr ""
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr ""
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr ""
 
@@ -678,7 +678,7 @@ msgstr ""
 msgid "Downloading images from remote URL is not enabled"
 msgstr ""
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -938,14 +938,14 @@ msgstr ""
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,598 +6432,602 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+msgid "Test template with the same key already exists for part"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8037,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8345,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8362,103 +8374,111 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+msgid "Snippet file with this name already exists"
+msgstr ""
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+msgid "Asset file with this name already exists"
+msgstr ""
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8785,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8830,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8822,7 +8842,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8899,7 +8919,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8931,7 +8951,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8979,184 +8999,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/hu/LC_MESSAGES/django.po b/InvenTree/locale/hu/LC_MESSAGES/django.po
index 7fd610ab1fdb..0b7313ca92a0 100644
--- a/InvenTree/locale/hu/LC_MESSAGES/django.po
+++ b/InvenTree/locale/hu/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Hungarian\n"
@@ -30,20 +30,20 @@ msgstr "Nincs jogosultságod az adatok megtekintéséhez"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Nincs érték megadva"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "{original} átváltása {unit}-ra sikertelen"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Hibás mennyiség"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Hibás mennyiség ({exc})"
@@ -65,9 +65,9 @@ msgstr "Dátum megadása"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "A megadott email domain nincs jóváhagyva."
 msgid "Registration is disabled."
 msgstr "Regisztráció le van tiltva."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Nem megfelelő mennyiség"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Üres sorozatszám"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Duplikált sorozatszám"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Hibás tartomány: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Csoport tartomány {group} több mint az engedélyezett ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Hibás csoport-sor: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Nem található sorozatszám"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Az egyedi sorozatszámok számának ({len(serials)}) meg kell egyeznie a mennyiséggel ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "HTML tag-ek eltávolítása ebből az értékből"
 
@@ -401,7 +401,7 @@ msgstr "Melléklet"
 msgid "Select file to attach"
 msgstr "Válaszd ki a mellekelni kívánt fájlt"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Megjegyzés"
 msgid "File comment"
 msgstr "Leírás, bővebb infó"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Duplikált nevek nem lehetnek ugyanazon szülő alatt"
 msgid "Invalid choice"
 msgstr "Érvénytelen választás"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Név"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Kiszolgálóhiba"
 msgid "An error has been logged by the server."
 msgstr "A kiszolgáló egy hibaüzenetet rögzített."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Érvényes számnak kell lennie"
 
@@ -678,7 +678,7 @@ msgstr "A távoli kép URL-je"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Képek letöltése távoli URL-ről nem engedélyezett"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Háttér folyamat ellenőrzés sikertelen"
 
@@ -938,14 +938,14 @@ msgstr "Verzió információk"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "A gyártást be kell fejezni a törlés előtt"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Fogyóeszköz"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Gyártási utasítás azonosító"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Gyártás, amihez ez a gyártás hozzá van rendelve"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Gyártás, amihez ez a gyártás hozzá van rendelve"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Gyártási állapot"
 msgid "Build status code"
 msgstr "Gyártás státusz kód"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Batch kód"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Gyártási kimenet nem egyezik a gyártási utasítással"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Mennyiségnek nullánál többnek kell lennie"
 
@@ -1285,10 +1285,10 @@ msgstr "Gyártás objektum"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Gyártás objektum"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Egyedi követésre kötelezett tételeknél a menyiség 1 kell legyen"
 msgid "Selected stock item does not match BOM line"
 msgstr "A készlet tétel nem egyezik az alkatrészjegyzékkel"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Egész számú mennyiség szükséges az egyedi követésre kötelezett
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Egész számú mennyiség szükséges, mivel az alkatrészjegyzék egyedi követésre kötelezett alkatrészeket tartalmaz"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Sorozatszámok"
@@ -1451,10 +1451,10 @@ msgstr "A következő sorozatszámok már léteznek vagy nem megfelelőek"
 msgid "A list of build outputs must be provided"
 msgstr "A gyártási kimenetek listáját meg kell adni"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "A kész gyártási kimenetek helye"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1568,7 +1568,7 @@ msgstr "Fogadd el hogy a készlet tételek nincsenek teljesen lefoglalva ehhez a
 msgid "Required stock has not been fully allocated"
 msgstr "A szükséges készlet nem lett teljesen lefoglalva"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Befejezetlenek elfogadása"
 
@@ -1604,11 +1604,11 @@ msgstr "Gyártás sor tétel"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part ugyanarra az alkatrészre kell mutasson mint a gyártási utasítás"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "A tételnek kell legyen készlete"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Rendelkezésre álló mennyiség ({q}) túllépve"
@@ -1621,7 +1621,7 @@ msgstr "Gyártási kimenetet meg kell adni a követésre kötelezett alkatrésze
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "Gyártási kimenetet nem lehet megadni a követésre kötelezett alkatrészek lefoglalásához"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "A lefoglalandó tételeket meg kell adni"
 
@@ -1661,7 +1661,7 @@ msgstr "Opcionális tételek"
 msgid "Allocate optional BOM items to build order"
 msgstr "Opcionális tételek lefoglalása a gyártáshoz"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Alkatrészjegyzék tétel"
@@ -1671,7 +1671,7 @@ msgid "Allocated Stock"
 msgstr "Lefoglalt készlet"
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1679,13 +1679,13 @@ msgstr "Lefoglalt készlet"
 msgid "On Order"
 msgstr "Rendelve"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr "Gyártásban"
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2119,1390 +2119,1400 @@ msgstr "Projekt leírása"
 msgid "User or group responsible for this project"
 msgstr "A projektért felelős felhasználó vagy csoport"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Beállítások kulcs (egyedinek kell lennie, nem kis- nagybetű érzékeny)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Beállítás értéke"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "A kiválasztott érték nem egy érvényes lehetőség"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "Az érték bináris kell legyen"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "Az érték egész szám kell legyen"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "Kulcs string egyedi kell legyen"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Nincs csoport"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Üres domain nem engedélyezett."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Érvénytelen domain név: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Nincsen plugin"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Újraindítás szükséges"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "Egy olyan beállítás megváltozott ami a kiszolgáló újraindítását igényli"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Függőben levő migrációk"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr "Függőben levő adatbázis migrációk"
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Kiszolgáló példány neve"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "String leíró a kiszolgáló példányhoz"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Példány név használata"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Példány név használata a címsorban"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Verzió infók megjelenítésének tiltása"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Verzió infók megjelenítése csak admin felhasználóknak"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Cég neve"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Belső cégnév"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "Kiindulási URL"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "Kiindulási URL a kiszolgáló példányhoz"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Alapértelmezett pénznem"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr "Válassz alap pénznemet az ár számításokhoz"
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr "Árfolyam frissítési gyakoriság"
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr "Milyen gyakran frissítse az árfolyamokat (nulla a kikapcsoláshoz)"
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "nap"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr "Árfolyam frissítő plugin"
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr "Kiválasztott árfolyam frissítő plugin"
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Letöltés URL-ről"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Képek és fájlok letöltésének engedélyezése külső URL-ről"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Letöltési méret korlát"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Maximum megengedett letöltési mérete a távoli képeknek"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "Felhasznált User-agent az URL-ről letöltéshez"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "A külső URL-ről letöltéshez használt user-agent felülbírálásának engedélyezése (hagyd üresen az alapértelmezéshez)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr "Erős URL validáció"
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr "Sablon specifikáció igénylése az URL validálásnál"
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Megerősítés igénylése"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Kérjen felhasználói megerősítést bizonyos műveletekhez"
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Fa mélység"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Alapértelmezett mélység a fa nézetekben. A mélyebb szintek betöltődnek ha szükségesek."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Frissítés keresés gyakorisága"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Milyen gyakran ellenőrizze van-e új frissítés (0=soha)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Automatikus biztonsági mentés"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Adatbázis és média fájlok automatikus biztonsági mentése"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Automata biztonsági mentés gyakorisága"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Hány naponta készüljön automatikus biztonsági mentés"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Feladat törlési gyakoriság"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "Háttérfolyamat eredmények törlése megadott nap eltelte után"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr "Hibanapló törlési gyakoriság"
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "Hibanapló bejegyzések törlése megadott nap eltelte után"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr "Értesítés törlési gyakoriság"
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Felhasználói értesítések törlése megadott nap eltelte után"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Vonalkód támogatás"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr "Vonalkód olvasó támogatás engedélyezése a web felületen"
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Vonalkód beadási késleltetés"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Vonalkód beadáskor a feldolgozás késleltetési ideje"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Webkamerás vonalkód olvasás"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Webkamerás kódolvasás engedélyezése a böngészőből"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr "Alkatrész változatok"
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr "Alkatrész változat vagy verziószám tulajdonság használata"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "IPN reguláris kifejezés"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Reguláris kifejezés ami illeszkedik az alkatrész IPN-re"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Többször is előforduló IPN engedélyezése"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Azonos IPN használható legyen több alkatrészre is"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "IPN szerkesztésének engedélyezése"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "IPN megváltoztatásánsak engedélyezése az alkatrész szerkesztése közben"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Alkatrészjegyzék adatok másolása"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Alkatrész másoláskor az alkatrészjegyzék adatokat is másoljuk alapból"
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Alkatrész paraméterek másolása"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Alkatrész másoláskor a paramétereket is másoljuk alapból"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Alkatrész teszt adatok másolása"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Alkatrész másoláskor a tesztek adatait is másoljuk alapból"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Kategória paraméter sablonok másolása"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Kategória paraméter sablonok másolása alkatrész létrehozásakor"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Sablon"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Alkatrészek alapból sablon alkatrészek legyenek"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Gyártmány"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Alkatrészeket alapból lehessen gyártani másik alkatrészekből"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Összetevő"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Alkatrészek alapból használhatók összetevőként más alkatrészekhez"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Beszerezhető"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Alkatrészek alapból beszerezhetők legyenek"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Értékesíthető"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Alkatrészek alapból eladhatók legyenek"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Követésre kötelezett"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Alkatrészek alapból követésre kötelezettek legyenek"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Virtuális"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Alkatrészek alapból virtuálisak legyenek"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Importálás megjelenítése a nézetekben"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Import segéd megjelenítése néhány alkatrész nézetben"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Kapcsolódó alkatrészek megjelenítése"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Alkatrész kapcsolódó alkatrészeinek megjelenítése"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Kezdeti készlet adatok"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Kezdeti készlet létrehozása új alkatrész felvételekor"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Kezdeti beszállítói adatok"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Kezdeti beszállítói adatok létrehozása új alkatrész felvételekor"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Alkatrész név megjelenítés formátuma"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Formátum az alkatrész név megjelenítéséhez"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Alkatrész kategória alapértelmezett ikon"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Alkatrész kategória alapértelmezett ikon (üres ha nincs)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr "Csak választható mértékegységek"
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr "A megadott mértékegység csak a beállított lehetőségekből legyen elfogadva"
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr "Áraknál használt tizedesjegyek min. száma"
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr "Tizedejegyek minimális száma az árak megjelenítésekor"
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr "Áraknál használt tizedesjegyek max. száma"
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr "Tizedejegyek maximális száma az árak megjelenítésekor"
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Beszállítói árazás használata"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr "Beszállítói ársávok megjelenítése az általános árkalkulációkban"
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Beszerzési előzmények felülbírálása"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr "Beszerzési árelőzmények felülírják a beszállítói ársávokat"
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Készlet tétel ár használata"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "A kézzel bevitt készlet tétel árak használata az árszámításokhoz"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Készlet tétel ár kora"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Az ennyi napnál régebbi készlet tételek kizárása az árszámításból"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr "Alkatrészváltozat árak használata"
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr "Alkatrészváltozat árak megjelenítése az általános árkalkulációkban"
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Csak az aktív változatokat"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr "Csak az aktív alkatrészváltozatok használata az árazásban"
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr "Árazás újraszámítás gyakoriság"
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr "Árak automatikus frissítése ennyi nap után"
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Belső árak"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "Alkatrészekhez belső ár engedélyezése"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Belső ár felülbírálása"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr "Ha elérhetőek az árkalkulációkban a belső árak lesznek alapul véve"
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Címke nyomtatás engedélyezése"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Címke nyomtatás engedélyezése a web felületről"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "Címke kép DPI"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr "Képek felbontása amik átadásra kerülnek címkenyomtató pluginoknak"
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Riportok engedélyezése"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Riportok előállításának engedélyezése"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Debug mód"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Riportok előállítása HTML formátumban (hibakereséshez)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+#, fuzzy
+#| msgid "No Reports Found"
+msgid "Log Report Errors"
+msgstr "Nem található riport"
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Lapméret"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Alapértelmezett lapméret a PDF riportokhoz"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Teszt riportok engedélyezése"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Teszt riportok előállításának engedélyezése"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Teszt riportok hozzáadása"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Teszt riport nyomtatáskor egy másolat hozzáadása a készlet tételhez"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr "Globálisan egyedi sorozatszámok"
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "A sorozatszámoknak egyedinek kell lennie a teljes készletre vonatkozóan"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Sorozatszámok automatikus kitöltése"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Sorozatszámok automatikus kitöltése a formokon"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Kimerült készlet törlése"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Alapértelmezett művelet mikor a készlet tétel elfogy"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr "Batch kód sablon"
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Sablon a készlet tételekhez alapértelmezett batch kódok előállításához"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Készlet lejárata"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "Készlet lejárat kezelésének engedélyezése"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "Lejárt készlet értékesítése"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "Lejárt készlet értékesítésének engedélyezése"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Álló készlet ideje"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Napok száma amennyivel a lejárat előtt a készlet tételeket állottnak vesszük"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Lejárt készlet gyártása"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Gyártás engedélyezése lejárt készletből"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "Készlet tulajdonosok kezelése"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Tulajdonosok kezelésének engedélyezése a készlet helyekre és tételekre"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr "Hely alapértelmezett ikon"
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr "Hely alapértelmezett ikon (üres ha nincs)"
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr "Beépített készlet megjelenítése"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr "Beépített készlet tételek megjelenítése a készlet táblákban"
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Gyártási utasítás azonosító minta"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Szükséges minta a gyártási utasítás azonosító mező előállításához"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr "Visszavétel engedélyezése"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr "Visszavételek engedélyezése a felületen"
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr "Visszavétel azonosító minta"
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr "Szükséges minta a visszavétel azonosító mező előállításához"
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr "Befejezett visszavétel szerkesztése"
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr "Visszavétel szerkesztésének engedélyezése befejezés után"
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr "Vevői rendelés azonosító minta"
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr "Szükséges minta a vevői rendelés azonosító mező előállításához"
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr "Vevői rendeléshez alapértelmezett szállítmány"
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr "Szállítmány automatikus létrehozása az új vevő rendelésekhez"
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr "Befejezett vevői rendelés szerkesztése"
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr "Vevői rendelések szerkesztésének engedélyezése szállítás vagy befejezés után"
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr "Beszerzési rendelés azonosító minta"
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr "Szükséges minta a beszerzési rendelés azonosító mező előállításához"
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Befejezett beszerzési rendelés szerkesztése"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr "Beszérzési rendelések szerkesztésének engedélyezése kiküldés vagy befejezés után"
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr "Beszerzési rendelések automatikus befejezése"
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr "A beszerzési rendelés automatikus befejezése ha minden sortétel beérkezett"
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Elfelejtett jelszó engedélyezése"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Elfelejtett jelszó funkció engedélyezése a bejentkező oldalon"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Regisztráció engedélyezése"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Felhaszálók önkéntes regisztrációjának engedélyezése a bejelentkező oldalon"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "SSO engedélyezése"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "SSO engedélyezése a bejelentkező oldalon"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "SSO regisztráció engedélyezése"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr "Felhaszálók önkéntes regisztrációjának engedélyezése SSO-n keresztül a bejelentkező oldalon"
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Email szükséges"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr "Kötelező email megadás regisztrációkor"
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "SSO felhasználók automatikus kitöltése"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Felhasználó adatainak automatikus kitöltése az SSO fiókadatokból"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "Email kétszer"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "Regisztráláskor kétszer kérdezze a felhasználó email címét"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Jelszó kétszer"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "Regisztráláskor kétszer kérdezze a felhasználó jelszavát"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Engedélyezett domainek"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr "Feliratkozás korlátozása megadott domain-ekre (vesszővel elválasztva, @-al kezdve)"
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Csoport regisztráláskor"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr "Csoport amihez a frissen regisztrált felhasználók hozzá lesznek rendelve"
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Többfaktoros hitelesítés kényszerítése"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "A felhasználóknak többfaktoros hitelesítést kell használniuk."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Pluginok ellenőrzése indításkor"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr "Ellenőrizze induláskor hogy minden plugin telepítve van - engedélyezd konténer környezetben (docker)"
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr "Plugin frissítések ellenőrzése"
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr "Frissítések periódikus ellenőrzésének engedélyezése a telepített pluginokra"
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "URL integráció engedélyezése"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "URL útvonalalak hozzáadásának engedélyezése a pluginok számára"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr "Navigációs integráció engedélyezése"
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr "Navigációs integráció engedélyezése a pluginok számára"
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "App integráció engedélyezése"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "App hozzáadásának engedélyezése a pluginok számára"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr "Ütemezés integráció engedélyezése"
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Háttérben futó feladatok hozzáadásának engedélyezése a pluginok számára"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr "Esemény integráció engedélyezése"
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr "Belső eseményekre reagálás engedélyezése a pluginok számára"
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr "Projektszámok engedélyezése"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr "Projektszámok használatának engedélyezése a projektek követéséhez"
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr "Leltár funkció"
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr "Leltár funkció engedélyezése a készlet mennyiség és érték számításhoz"
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr "Külső helyek nélkül"
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr "Külső helyek figyelmen kívül hagyása a leltár számításoknál"
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr "Automatikus leltár időpontja"
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr "Hány naponta történjen automatikus leltár (nulla egyenlő tiltva)"
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr "Riport törlési gyakoriság"
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr "Régi leltár riportok törlése hány naponta történjen"
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr "Felhasználók teljes nevének megjelenítése"
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr "Felhasználói név helyett a felhasználók teljes neve jelenik meg"
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Beállítások kulcs (egyedinek kell lennie, nem kis- nagybetű érzékeny"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr "Inaktív alkatrészek elrejtése"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr "Nem aktív alkatrészek elrejtése a kezdőlapon"
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Értesítésre beállított alkatrészek megjelenítése"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Alkatrész értesítések megjelenítése a főoldalon"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Értesítésre beállított kategóriák megjelenítése"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Alkatrész kategória értesítések megjelenítése a főoldalon"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Legújabb alkatrészek megjelenítése"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Legújabb alkatrészek megjelenítése a főoldalon"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Jóváhagyás nélküli alkatrészjegyzékek megjelenítése"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Jóváhagyásra váró alkatrészjegyzékek megjelenítése a főoldalon"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Legfrissebb készlet változások megjelenítése"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Legutóbb megváltozott alkatrészek megjelenítése a főoldalon"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Alacsony készlet megjelenítése"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Alacsony készletek megjelenítése a főoldalon"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Kimerült készlet megjelenítése"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Kimerült készletek megjelenítése a főoldalon"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Gyártáshoz szükséges készlet megjelenítése"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Gyártáshoz szükséges készletek megjelenítése a főoldalon"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Lejárt készlet megjelenítése"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Lejárt készletek megjelenítése a főoldalon"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Állott készlet megjelenítése"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Álló készletek megjelenítése a főoldalon"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Függő gyártások megjelenítése"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Folyamatban lévő gyártások megjelenítése a főoldalon"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Késésben lévő gyártások megjelenítése"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Késésben lévő gyártások megjelenítése a főoldalon"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr "Kintlévő beszerzési rendelések megjelenítése"
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr "Kintlévő beszerzési rendelések megjelenítése a főoldalon"
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Késésben lévő megrendelések megjelenítése"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr "Késésben lévő megrendelések megjelenítése a főoldalon"
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr "Függő vevői rendelések megjelenítése"
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr "Függő vevői rendelések megjelenítése a főoldalon"
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Késésben lévő vevői rendelések megjelenítése"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr "Késésben lévő vevői rendelések megjelenítése a főoldalon"
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr "Függő vevői szállítmányok megjelenítése"
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr "Folyamatban lévő vevői szállítmányok megjelenítése a főoldalon"
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Hírek megjelenítése"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Hírek megjelenítése a főoldalon"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "Beágyazott címke megjelenítés"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "PDF címkék megjelenítése a böngészőben letöltés helyett"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr "Alapértelmezett címkenyomtató"
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr "Melyik címkenyomtató legyen az alapértelmezett"
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr "Beágyazott riport megjelenítés"
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "PDF riport megjelenítése a böngészőben letöltés helyett"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Alkatrészek keresése"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr "Alkatrészek megjelenítése a keresési előnézetben"
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr "Beszállítói alkatrészek keresése"
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr "Beszállítói alkatrészek megjelenítése a keresési előnézetben"
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Gyártói alkatrészek keresése"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr "Gyártói alkatrészek megjelenítése a keresési előnézetben"
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Inaktív alkatrészek elrejtése"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr "Inaktív alkatrészek kihagyása a keresési előnézet találataiból"
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr "Kategóriák keresése"
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr "Alkatrész kategóriák megjelenítése a keresési előnézetben"
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Készlet keresése"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Készlet tételek megjelenítése a keresési előnézetben"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Nem elérhető készlet tételek elrejtése"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Nem elérhető készlet kihagyása a keresési előnézet találataiból"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Helyek keresése"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr "Készlet helyek megjelenítése a keresési előnézetben"
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Cégek keresése"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr "Cégek megjelenítése a keresési előnézetben"
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Gyártási utasítások keresése"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr "Gyártási utasítások megjelenítése a keresés előnézet ablakban"
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Beszerzési rendelések keresése"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr "Beszerzési rendelések megjelenítése a keresési előnézetben"
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Inaktív beszerzési rendelések kihagyása"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr "Inaktív beszerzési rendelések kihagyása a keresési előnézet találataiból"
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Vevői rendelések keresése"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr "Vevői rendelések megjelenítése a keresési előnézetben"
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr "Inaktív vevői rendelések kihagyása"
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr "Inaktív vevői rendelések kihagyása a keresési előnézet találataiból"
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Visszavétel keresése"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr "Visszavételek megjelenítése a keresés előnézet ablakban"
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr "Inaktív visszavételek kihagyása"
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr "Inaktív visszavételek kihagyása a keresési előnézet találataiból"
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "Keresési előnézet eredményei"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr "A keresési előnézetben megjelenítendő eredmények száma szekciónként"
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Regex keresés"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr "Reguláris kifejezések engedélyezése a keresésekben"
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr "Teljes szó keresés"
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr "A keresések csak teljes szóra egyező találatokat adjanak"
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Mennyiség megjelenítése a formokon"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "Rendelkezésre álló alkatrész mennyiség megjelenítése néhány formon"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr "ESC billentyű zárja be a formot"
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr "ESC billentyű használata a modális formok bezárásához"
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Rögzített menüsor"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr "A menü pozíciója mindig rögzítve a lap tetején"
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Dátum formátum"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Preferált dátum formátum a dátumok kijelzésekor"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Alkatrész ütemezés"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr "Alkatrész ütemezési információk megjelenítése"
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr "Alkatrész leltár"
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr "Alkatrész leltár információk megjelenítése (ha a leltár funkció engedélyezett)"
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr "Táblázati szöveg hossz"
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr "Maximális szöveg hossz ami megjelenhet a táblázatokban"
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr "Alapértelmezett alkatrész címke sablon"
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr "Az alapértelmezetten kiválasztott alkatrész címke sablon"
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr "Alapértelmezett készlet címke sablon"
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr "Az alapértelmezetten kiválasztott készlet címke sablon"
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr "Alapértelmezett készlethely címke sablon"
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr "Az alapértelmezetten kiválasztott készlethely címke sablon"
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr "Hibariportok fogadása"
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr "Értesítések fogadása a rendszerhibákról"
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr "Ársáv mennyiség"
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3510,23 +3520,23 @@ msgstr "Ársáv mennyiség"
 msgid "Price"
 msgstr "Ár"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr "Egységár egy meghatározott mennyiség esetén"
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Végpont"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr "Végpont ahol ez a webhook érkezik"
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr "Webhook neve"
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3536,101 +3546,101 @@ msgstr "Webhook neve"
 msgid "Active"
 msgstr "Aktív"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr "Aktív-e ez a webhook"
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Token"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Token a hozzáféréshez"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Titok"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr "Megosztott titok a HMAC-hoz"
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "Üzenet azonosító"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr "Egyedi azonosító ehhez az üzenethez"
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Kiszolgáló"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr "Kiszolgáló ahonnan ez az üzenet érkezett"
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Fejléc"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "Üzenet fejléce"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Törzs"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr "Üzenet törzse"
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr "Végpont amin ez az üzenet érkezett"
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr "Dolgozott rajta"
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr "Befejeződött a munka ezzel az üzenettel?"
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Id"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Cím"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Közzétéve"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Szerző"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Összefoglaló"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Elolvasva"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr "Elolvasva?"
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3640,31 +3650,31 @@ msgstr "Elolvasva?"
 msgid "Image"
 msgstr "Kép"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "Képfájl"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr "A mértékegységnek valós azonosítónak kell lennie"
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr "Egység neve"
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr "Szimbólum"
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr "Opcionális mértékegység szimbólum"
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr "Definíció"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr "Mértékegység definíció"
 
@@ -3968,7 +3978,7 @@ msgid "Link to address information (external)"
 msgstr "Link a címinformációkhoz (külső)"
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Kiindulási alkatrész"
@@ -3979,7 +3989,7 @@ msgstr "Válassz alkatrészt"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3994,7 +4004,7 @@ msgid "Select manufacturer"
 msgstr "Gyártó kiválasztása"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4040,7 +4050,7 @@ msgid "Parameter value"
 msgstr "Paraméter értéke"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4066,7 +4076,7 @@ msgstr "Kapcsolódó gyártói alkatrésznek ugyanarra a kiindulási alkatrészr
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4083,7 +4093,7 @@ msgstr "Beszállító"
 msgid "Select supplier"
 msgstr "Beszállító kiválasztása"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Beszállítói cikkszám"
 
@@ -4100,13 +4110,13 @@ msgid "Supplier part description"
 msgstr "Beszállítói alkatrész leírása"
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Megjegyzés"
 
@@ -4119,7 +4129,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Minimális díj (pl. tárolási díj)"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4225,7 +4235,7 @@ msgstr "Kép törlése"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4436,7 +4446,7 @@ msgstr "Nincs elérhető gyártói információ"
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4536,7 +4546,7 @@ msgid "No supplier information available"
 msgstr "Nincs elérhető beszállítói információ"
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4586,10 +4596,10 @@ msgid "Update Part Availability"
 msgstr "Alkatrész elérhetőség frissítése"
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4649,7 +4659,7 @@ msgstr "Címke"
 msgid "Label template file"
 msgstr "Címke sablon fájl"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4675,7 +4685,7 @@ msgstr "Magasság [mm]"
 msgid "Label height, specified in mm"
 msgstr "Címke magassága, mm-ben"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Fájlnév minta"
 
@@ -4689,8 +4699,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr "Lekérdezés szűrők (vesszővel elválasztott kulcs=érték párok)"
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Szűrők"
 
@@ -4848,11 +4858,11 @@ msgstr "Visszavétel"
 msgid "Total price for this order"
 msgstr "A rendelés teljes ára"
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr "Rendelés pénzneme"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr "Megrendeléshez használt pénznem (hagyd üresen a cégnél alapértelmezetthez)"
 
@@ -5039,7 +5049,7 @@ msgstr "Beérkezett"
 msgid "Number of items received"
 msgstr "Érkezett tételek száma"
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5094,8 +5104,8 @@ msgstr "Ellenőrizte"
 msgid "User who checked this shipment"
 msgstr "Felhasználó aki ellenőrizte ezt a szállítmányt"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Szállítmány"
 
@@ -5143,7 +5153,7 @@ msgstr "Nem foglalható készlet egy olyan sorhoz amiben nincs alkatrész"
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "A lefoglalandó mennyiség nem haladhatja meg a készlet mennyiségét"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Egyedi követésre kötelezett tételeknél a menyiség 1 kell legyen"
 
@@ -5217,159 +5227,159 @@ msgstr "Sortétel végső kimenetele"
 msgid "Cost associated with return or repair for this line item"
 msgstr "Sortétel visszaküldésének vagy javításának költsége"
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "A rendelést nem lehet törölni"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr "Rendelés lezárása teljesítetlen sortételek esetén is"
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr "A rendelésben teljesítetlen sortételek vannak"
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "A rendelés nem nyitott"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Beszérzési ár pénzneme"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr "Beszállítói alkatrészt meg kell adni"
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr "Beszerzési rendelést meg kell adni"
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr "A beszállítónak egyeznie kell a beszerzési rendelésben lévővel"
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr "A beszerzési rendelésnek egyeznie kell a beszállítóval"
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr "Sortétel"
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr "Sortétel nem egyezik a beszerzési megrendeléssel"
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr "Válassz cél helyet a beérkezett tételeknek"
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr "Írd be a batch kódját a beérkezett tételeknek"
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Írd be a sorozatszámokat a beérkezett tételekhez"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Vonalkód"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr "Beolvasott vonalkód"
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "Ez a vonalkód már használva van"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Egész számú mennyiség szükséges az egyedi követésre kötelezett alkatrészeknél"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr "Sortételt meg kell adni"
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr "A cél helyet kötelező megadni"
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr "Megadott vonalkódoknak egyedieknek kel lenniük"
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr "Eladási ár pénzneme"
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr "Nincsenek szállítmány részletek megadva"
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr "Sortétel nincs hozzárendelve ehhez a rendeléshez"
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr "Mennyiség pozitív kell legyen"
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Írd be a sorozatszámokat a kiosztáshoz"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr "Szállítmány kiszállítva"
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr "Szállítmány nincs hozzárendelve ehhez a rendeléshez"
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr "Nincs találat a következő sorozatszámokra"
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr "A következő sorozatszámok már ki lettek osztva"
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr "Visszavétel sortétel"
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr "Sortétel nem egyezik a visszavétellel"
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr "A sortétel már beérkezett"
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr "Csak folyamatban lévő megrendelés tételeit lehet bevételezni"
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr "Sortétel pénzneme"
 
@@ -5773,12 +5783,12 @@ msgstr "A {part} egységára {price}-ra módosítva"
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr "A {part} alkatrész módosított egységára {price} mennyisége pedig {qty}"
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "Alkatrész ID"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Alkatrész neve"
@@ -5795,7 +5805,7 @@ msgid "IPN"
 msgstr "IPN"
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Változat"
@@ -5871,8 +5881,8 @@ msgstr "Szülő neve"
 msgid "Category Path"
 msgstr "Kategória elérési út"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5895,17 +5905,17 @@ msgstr "Alkatrészjegyzék tétel ID"
 msgid "Parent IPN"
 msgstr "Szülő IPN"
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr "Alkatrész IPN"
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr "Minimum ár"
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5983,8 +5993,8 @@ msgstr "Teljes alkatrészjegyzék jóváhagyása"
 msgid "This option must be selected"
 msgstr "Ennek az opciónak ki kll lennie választva"
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -6001,7 +6011,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Alapértelmezett hely"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Teljes készlet"
@@ -6010,7 +6020,7 @@ msgstr "Teljes készlet"
 msgid "Input quantity for price calculation"
 msgstr "Add meg a mennyiséget az árszámításhoz"
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Alkatrész kategória"
@@ -6092,7 +6102,7 @@ msgstr "Ilyen nevű, IPN-ű és reviziójú alkatrész már létezik."
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr "Szerkezeti kategóriákhoz nem lehet alkatrészeket rendelni!"
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Alkatrész neve"
 
@@ -6426,604 +6436,610 @@ msgstr "Leltározott alkatrészek száma"
 msgid "User who requested this stocktake report"
 msgstr "Felhasználó aki a leltár riportot kérte"
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr "Teszt sablont csak követésre kötelezett alkatrészhez lehet csinálni"
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Test with this name already exists for this part"
+msgid "Test template with the same key already exists for part"
 msgstr "Erre az alkatrészre már létezik teszt ilyen névvel"
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Teszt név"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr "Add meg a teszt nevét"
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Teszt leírása"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr "Adj hozzá egy leírást ehhez a teszthez"
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Kötelező"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr "Szükséges-e hogy ez a teszt sikeres legyen?"
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Kötelező érték"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr "Szükséges-e hogy ennek a tesztnek az eredményéhez kötelezően érték legyen rendelve?"
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr "Kötelező melléklet"
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr "Szükséges-e hogy ennek a tesztnek az eredményéhez kötelezően fájl melléklet legyen rendelve?"
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr "Jelölőnégyzet paraméternek nem lehet mértékegysége"
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr "Jelölőnégyzet paraméternek nem lehetnek választási lehetőségei"
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr "A lehetőségek egyediek kell legyenek"
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr "A paraméter sablon nevének egyedinek kell lennie"
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr "Paraméter neve"
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr "Paraméter mértékegysége"
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr "Paraméter leírása"
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr "Jelölőnégyzet"
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr "Ez a paraméter egy jelölőnégyzet?"
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr "Lehetőségek"
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr "Választható lehetőségek (vesszővel elválasztva)"
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr "Hibás választás a paraméterre"
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr "Szülő alkatrész"
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Paraméter sablon"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Adat"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Paraméter értéke"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Alapértelmezett érték"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr "Alapértelmezett paraméter érték"
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr "Alkatrész ID vagy alkatrész név"
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr "Egyedi alkatrész ID értéke"
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr "Alkatrész IPN érték"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr "Szint"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr "Alkatrészjegyzék szint"
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr "Szülő alkatrész kiválasztása"
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr "Al alkatrész"
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr "Válaszd ki az alkatrészjegyzékben használandó alkatrészt"
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr "Alkatrészjegyzék mennyiség ehhez az alkatrészjegyzék tételhez"
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr "Ez az alkatrészjegyzék tétel opcionális"
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr "Ez az alkatrészjegyzék tétel fogyóeszköz (készlete nincs követve a gyártásban)"
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr "Többlet"
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Becsült gyártási veszteség (abszolút vagy százalékos)"
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr "Alkatrészjegyzék tétel azonosító"
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr "Alkatrészjegyzék tétel megjegyzései"
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr "Ellenőrző összeg"
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr "Alkatrészjegyzék sor ellenőrző összeg"
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "Jóváhagyva"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr "Ez a BOM tétel jóvá lett hagyva"
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr "Öröklődött"
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr "Ezt az alkatrészjegyzék tételt az alkatrész változatok alkatrészjegyzékei is öröklik"
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Változatok"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr "Alkatrészváltozatok készlet tételei használhatók ehhez az alkatrészjegyzék tételhez"
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr "A mennyiség egész szám kell legyen a követésre kötelezett alkatrészek esetén"
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr "Al alkatrészt kötelező megadni"
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr "Alkatrészjegyzék tétel helyettesítő"
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr "A helyettesítő alkatrész nem lehet ugyanaz mint a fő alkatrész"
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr "Szülő alkatrészjegyzék tétel"
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr "Helyettesítő alkatrész"
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr "1.rész"
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr "2.rész"
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr "Válassz kapcsolódó alkatrészt"
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr "Alkatrész kapcsolat nem hozható létre önmagával"
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr "Már létezik duplikált alkatrész kapcsolat"
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Alkategóriák"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Beszerzési pénzneme ennek a készlet tételnek"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr "Nincs kiválasztva alkatrész"
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr "Válassz kategóriát"
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr "Eredeti alkatrész"
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr "Válassz eredeti alkatrészt a másoláshoz"
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Kép másolása"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr "Kép másolása az eredeti alkatrészről"
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr "Alkatrészjegyzék másolása"
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr "Alkatrészjegyzék másolása az eredeti alkatrészről"
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Paraméterek másolása"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr "Paraméterek másolása az eredeti alkatrészről"
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr "Megjegyzések másolása"
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr "Megjegyzések másolása az eredeti alkatrészről"
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr "Kezdeti készlet mennyiség"
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr "Add meg a kezdeti készlet mennyiséget. Ha nulla akkor nem lesz készlet létrehozva."
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr "Kezdeti készlet hely"
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr "Add meg a kezdeti készlet helyét"
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr "Válassz beszállítót (hagyd üresen ha nem kell létrehozni)"
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr "Válassz gyártót (hagyd üresen ha nem kell létrehozni)"
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr "Gyártói cikkszám"
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr "A kiválasztott cég nem érvényes beszállító"
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr "A kiválasztott cég nem érvényes gyártó"
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr "Van már ilyen gyártói alkatrész"
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr "Van már ilyen beszállítói alkatrész"
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "Exclude External Stock"
 msgid "External Stock"
 msgstr "Külső készlet nélkül"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Allocated Stock"
 msgid "Unallocated Stock"
 msgstr "Lefoglalt készlet"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 #, fuzzy
 #| msgid "Allow Variant Stock"
 msgid "Variant Stock"
 msgstr "Készlet változatok engedélyezése"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "Alkatrész másolása"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr "Kezdeti adatok másolása egy másik alkatrészről"
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr "Kezdeti készlet"
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr "Kezdeti készlet mennyiség létrehozása"
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr "Beszállító információ"
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr "Kezdeti beszállító adatok hozzáadása"
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr "Kategória paraméterek másolása"
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr "Paraméter sablonok másolása a kiválasztott alkatrész kategóriából"
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr "Meglévő kép"
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr "A meglévő alkatrész képfájl neve"
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr "A képfájl nem létezik"
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr "Leltár riport korlátozása bizonyos alkatrészre és variánsra"
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr "Leltár riport korlátozása bizonyos alkatrész kategóriára és az alatta lévőkre"
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr "Leltár riport korlátozása bizonyos készlethelyre és az alatta lévőkre"
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr "Külső készlet nélkül"
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr "Külső helyeken lévő készlet nélkül"
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Riport létrehozása"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr "Riport fájl létrehozása a számított leltár adatokkal"
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr "Alaktrészek frissítése"
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr "Megadott alkatrészek frissítése a számított leltár adatokkal"
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr "Leltár funkció nincs engedélyezve"
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr "Számított minimum ár felülbírálása"
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr "Minimum ár pénzneme"
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr "Számított maximum ár felülbírálása"
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr "Maximum ár pénzneme"
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr "Frissítés"
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr "Alkatrész árak frissítése"
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr "Megadott pénznem átváltása {default_currency}-re sikertelen"
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr "A Minimum ár nem lehet nagyobb mint a Maximum ár"
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr "A Maximum ár nem lehet kisebb mint a Minimum ár"
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr "Válassz alkatrészt ahonnan az alkatrészjegyzéket másoljuk"
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr "Létező adat törlése"
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr "Meglévő alkatrészjegyzék tételek törlése a másolás előtt"
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr "Örököltekkel együtt"
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr "Sablon alkatrészektől örökölt alkatrészjegyzék tételek használata"
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr "Hibás sorok kihagyása"
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr "Engedély a hibás sorok kihagyására"
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr "Helyettesítő alkatrészek másolása"
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr "Helyettesítő alkatrészek másolása az alkatrészjegyzék tételek másolásakor"
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr "Meglévő alkatrészjegyzék törlése"
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr "Meglévő alkatrészjegyzék tételek törlése a feltöltés előtt"
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr "Nincs megadva alkatrész oszlop"
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr "Több egyező alkatrész is található"
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr "Nincs egyező alkatrész"
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr "Az alkatrész nem lett összetevőként jelölve"
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr "Mennyiség nincs megadva"
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Érvénytelen mennyiség"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr "Legalább egy alkatrészjegyzék tétel szükséges"
 
@@ -8033,7 +8049,7 @@ msgstr "Szegély"
 msgid "Print a border around each label"
 msgstr "Az egyes címkék körüli margó"
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr "Fekvő"
 
@@ -8341,16 +8357,16 @@ msgstr "Konfiguráció törlése"
 msgid "Delete the plugin configuration from the database"
 msgstr "Plugin konfiguráció törlése az adatbázisból"
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "Nincs érvényes objektum megadva a sablonhoz"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr "A '{template}' sablon fájl hiányzik vagy nem érhető el"
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr "Teszt riport"
 
@@ -8370,103 +8386,115 @@ msgstr "Jogi információk"
 msgid "Letter"
 msgstr "„Letter” méret"
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Sablon neve"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "Riport sablon fájl"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr "Riport sablon leírása"
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr "Riport verziószáma (automatikusan nő)"
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr "Lapméret a PDF riportokhoz"
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr "Jelentés fekvő nézetben"
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr "Minta a riport fájlnevek előállításához"
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr "Riport sablon engedélyezve"
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr "Készlet lekérdezés szűrők (vesszővel elválasztott kulcs=érték párok)"
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr "Beépített tesztekkel együtt"
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr "Gyártmányba beépített készlet tételek teszt eredményeivel együtt"
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr "Gyártás szűrők"
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr "Gyártás lekérdezés szűrők (vesszővel elválasztott kulcs=érték párok"
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Alkatrész szűrők"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr "Alkatrész lekérdezés szűrők (vesszővel elválasztott kulcs=érték párok"
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr "Megrendelés lekérdezés szűrők"
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr "Vevő rendelés lekérdezés szűrők"
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr "Visszavétel lekérdezés szűrők"
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Stock item with this serial number already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Létezik már készlet tétel ilyen a sorozatszámmal"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Részlet"
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr "Riport részlet fájl"
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr "Részlet fájl leírása"
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Ilyen fájlnévvel már létezik melléklet"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr "Eszköz"
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr "Riport asset fájl"
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr "Asset fájl leírása"
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr "készlethely lekérdezés szűrők (vesszővel elválasztott kulcs=érték párok)"
 
@@ -8773,7 +8801,7 @@ msgstr "Nem lehet ezt a raktári helyet szerkezetivé tenni, mert már vannak it
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr "A szerkezeti raktári helyre nem lehet készletet felvenni!"
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr "Virtuális alkatrészből nem lehet készletet létrehozni"
 
@@ -8818,7 +8846,7 @@ msgstr "Válassz egy egyező beszállítói alkatrészt ehhez a készlet tételh
 msgid "Where is this stock item located?"
 msgstr "Hol található ez az alkatrész?"
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr "A csomagolása ennek a készlet tételnek itt van tárolva"
 
@@ -8830,7 +8858,7 @@ msgstr "Ez a tétel be van építve egy másik tételbe?"
 msgid "Serial number for this item"
 msgstr "Sorozatszám ehhez a tételhez"
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr "Batch kód ehhez a készlet tételhez"
 
@@ -8907,7 +8935,7 @@ msgstr "A sorozatszám egész számok listája kell legyen"
 msgid "Quantity does not match serial numbers"
 msgstr "A mennyiség nem egyezik a megadott sorozatszámok számával"
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "A sorozatszámok már léteznek"
 
@@ -8939,7 +8967,7 @@ msgstr "Készlet tétel gyártás alatt"
 msgid "Serialized stock cannot be merged"
 msgstr "Követésre kötelezett készlet nem vonható össze"
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr "Duplikált készlet tételek vannak"
 
@@ -8987,184 +9015,184 @@ msgstr "Teszt eredmény melléklet"
 msgid "Test notes"
 msgstr "Tesztek megjegyzései"
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr "Szériaszám túl nagy"
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr "Csomagolási mennyiség használata: a megadott mennyiség ennyi csomag"
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr "Készlet tétel beszerzési ára, per darab vagy csomag"
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr "Add meg hány készlet tételt lássunk el sorozatszámmal"
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr "A mennyiség nem lépheti túl a rendelkezésre álló készletet ({q})"
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "Írd be a sorozatszámokat az új tételekhez"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr "Cél készlet hely"
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr "Opcionális megjegyzés mező"
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr "Sorozatszámokat nem lehet hozzárendelni ehhez az alkatrészhez"
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr "Válaszd ki a beépítésre szánt készlet tételt"
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr "Beépítendő mennyiség"
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr "Adja meg a beépítendő mennyiséget"
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr "Tranzakció megjegyzés hozzáadása (opcionális)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr "A beépítendő mennyiség legalább 1 legyen"
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr "Készlet tétel nem elérhető"
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr "A kiválasztott alkatrész nincs az alkatrészjegyzékben"
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr "A beépítendő mennyiség nem haladhatja meg az elérhető mennyiséget"
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr "Cél hely a kiszedett tételeknek"
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr "Válassz alkatrészt amire konvertáljuk a készletet"
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr "A kiválasztott alkatrész nem megfelelő a konverzióhoz"
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr "Készlet tétel hozzárendelt beszállítói alkatrésszel nem konvertálható"
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr "Cél hely a visszatérő tételeknek"
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr "Válaszd ki a státuszváltásra szánt készlet tételeket"
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr "Nincs készlet tétel kiválasztva"
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Alhelyek"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr "Az alkatrésznek értékesíthetőnek kell lennie"
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr "A tétel egy vevő rendeléshez foglalt"
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr "A tétel egy gyártási utasításhoz foglalt"
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr "Vevő akihez rendeljük a készlet tételeket"
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr "A kiválasztott cég nem egy vevő"
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr "Készlet hozzárendelés megjegyzései"
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr "A készlet tételek listáját meg kell adni"
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr "Készlet összevonás megjegyzései"
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr "Nem egyező beszállítók megengedése"
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr "Különböző beszállítói alkatrészekből származó készletek összevonásának engedélyezése"
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr "Nem egyező állapotok megjelenítése"
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr "Különböző állapotú készletek összevonásának engedélyezése"
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr "Legalább két készlet tételt meg kell adni"
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr "Nincs változás"
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr "Készlet tétel elsődleges kulcs értéke"
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr "Készlet tétel státusz kódja"
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr "Készlet tranzakció megjegyzései"
 
diff --git a/InvenTree/locale/id/LC_MESSAGES/django.po b/InvenTree/locale/id/LC_MESSAGES/django.po
index c788eee3cf3a..b203f697490a 100644
--- a/InvenTree/locale/id/LC_MESSAGES/django.po
+++ b/InvenTree/locale/id/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Indonesian\n"
@@ -30,20 +30,20 @@ msgstr "Pengguna tidak memiliki izin untuk melihat model ini"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Nilai tidak tersedia"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr "Masukkan tanggal"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Domain surel yang diberikan tidak perbolehkan."
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Jumlah yang diberikan tidak valid"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Nomor seri kosong"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr ""
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Tidak ada nomor seri ditemukan"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Hapus tag-tag HTML dari nilai ini"
 
@@ -401,7 +401,7 @@ msgstr "Lampiran"
 msgid "Select file to attach"
 msgstr "Pilih file untuk dilampirkan"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Komentar"
 msgid "File comment"
 msgstr "Komentar file"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr "Pilihan tidak valid"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Nama"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Terjadi Kesalahan Server"
 msgid "An error has been logged by the server."
 msgstr "Sebuah kesalahan telah dicatat oleh server."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Harus berupa angka yang valid"
 
@@ -678,7 +678,7 @@ msgstr "URL file gambar external"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Unduhan gambar dari URL external tidak aktif"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -938,14 +938,14 @@ msgstr "Tentang InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Pesanan harus dibatalkan sebelum dapat dihapus"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Referensi Order Produksi"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Produksi induk dari produksi ini"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Produksi induk dari produksi ini"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Status pembuatan"
 msgid "Build status code"
 msgstr "Kode status pembuatan"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Kode Kelompok"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Hasil produksi tidak sesuai dengan order produksi"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Jumlah harus lebih besar daripada nol"
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Jumlah harus 1 untuk stok dengan nomor seri"
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Jumlah bagian yang dapat dilacak harus berupa angka bulat"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Jumlah harus angka bulat karena terdapat bagian yang dapat dilacak dalam daftar barang"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Nomor Seri"
@@ -1451,10 +1451,10 @@ msgstr "Nomor-nomor seri berikut sudah ada atau tidak valid"
 msgid "A list of build outputs must be provided"
 msgstr "Daftar hasil pesanan harus disediakan"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Lokasi hasil pesanan yang selesai"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Terima bahwa stok item tidak teralokasikan sepenuhnya ke pesanan ini"
 msgid "Required stock has not been fully allocated"
 msgstr "Stok yang diperlukan belum teralokasikan sepenuhnya"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Terima Tidak Selesai"
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part harus mengarah ke bagian yang sesuai dengan order produksi"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "Item harus tersedia dalam stok"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Jumlah tersedia ({q}) terlampaui"
@@ -1619,7 +1619,7 @@ msgstr "Hasil produksi harus ditentukan untuk mengalokasikan bagian yang terlaca
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "Hasil produksi tidak dapat ditentukan untuk alokasi barang yang tidak terlacak"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Item yang dialokasikan harus disediakan"
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Item tagihan material"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Surel diperlukan"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,602 +6432,608 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Lampiran dengan nama file ini sudah ada"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "Tautan eksternal"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Accept Unallocated"
 msgid "Unallocated Stock"
 msgstr "Terima Tidak Teralokasikan"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8029,7 +8043,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8337,16 +8351,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8366,103 +8380,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Lampiran dengan nama file ini sudah ada"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Lampiran dengan nama file ini sudah ada"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8769,7 +8795,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8814,7 +8840,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8826,7 +8852,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8903,7 +8929,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8935,7 +8961,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8983,184 +9009,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/it/LC_MESSAGES/django.po b/InvenTree/locale/it/LC_MESSAGES/django.po
index 03e78a1721c7..3724c40e6f48 100644
--- a/InvenTree/locale/it/LC_MESSAGES/django.po
+++ b/InvenTree/locale/it/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Italian\n"
@@ -30,20 +30,20 @@ msgstr "L'utente non ha i permessi per vedere questo modello"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Nessun valore specificato"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Impossibile convertire {original} in {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Quantità fornita non valida"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Quantità fornita non valida ({exc})"
@@ -65,9 +65,9 @@ msgstr "Inserisci la data"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "L'indirizzo di posta elettronica fornito non è approvato."
 msgid "Registration is disabled."
 msgstr "La registrazione è disabilitata."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Quantità inserita non valida"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Numero seriale vuoto"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Seriale Duplicato"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Intervallo di gruppo non valido: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "L'intervallo di gruppo {group} supera la quantità consentita ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Sequenza di gruppo non valida: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Nessun numero di serie trovato"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Il numero di numeri di serie univoci ({len(serials)}) deve corrispondere alla quantità ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Rimuovi i tag HTML da questo valore"
 
@@ -401,7 +401,7 @@ msgstr "Allegato"
 msgid "Select file to attach"
 msgstr "Seleziona file da allegare"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Commento"
 msgid "File comment"
 msgstr "Commento del file"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Nomi duplicati non possono esistere sotto lo stesso genitore"
 msgid "Invalid choice"
 msgstr "Scelta non valida"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Nome"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Errore del server"
 msgid "An error has been logged by the server."
 msgstr "Un errore è stato loggato dal server."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Deve essere un numero valido"
 
@@ -678,7 +678,7 @@ msgstr "URL del file immagine remota"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Il download delle immagini da URL remoto non è abilitato"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Controllo in background non riuscito"
 
@@ -938,14 +938,14 @@ msgstr "Informazioni Su InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "La produzione deve essere annullata prima di poter essere eliminata"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Consumabile"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Riferimento Ordine Di Produzione"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Ordine di produzione a cui questa produzione viene assegnata"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Ordine di produzione a cui questa produzione viene assegnata"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Stato Produzione"
 msgid "Build status code"
 msgstr "Codice stato di produzione"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Codice Lotto"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "L'output della produzione non corrisponde all'ordine di compilazione"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "La quantità deve essere maggiore di zero"
 
@@ -1285,10 +1285,10 @@ msgstr "Crea oggetto"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Crea oggetto"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "La quantità deve essere 1 per lo stock serializzato"
 msgid "Selected stock item does not match BOM line"
 msgstr "L'articolo in stock selezionato non corrisponde alla voce nella BOM"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Quantità totale richiesta per articoli rintracciabili"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Quantità totale richiesta, poiché la fattura dei materiali contiene articoli rintracciabili"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Codice Seriale"
@@ -1451,10 +1451,10 @@ msgstr "I seguenti numeri di serie sono già esistenti o non sono validi"
 msgid "A list of build outputs must be provided"
 msgstr "Deve essere fornito un elenco dei risultati di produzione"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Posizione per gli output di build completati"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Accetta che gli elementi in giacenza non sono stati completamente assegn
 msgid "Required stock has not been fully allocated"
 msgstr "La giacenza richiesta non è stata completamente assegnata"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Accetta Incompleta"
 
@@ -1602,11 +1602,11 @@ msgstr "Articolo linea di produzione"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "gli elementi degli articoli della distinta base devono puntare alla stessa parte dell'ordine di produzione"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "L'articolo deve essere disponibile"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Quantità disponibile ({q}) superata"
@@ -1619,7 +1619,7 @@ msgstr "L'output di produzione deve essere specificato per l'ubicazione delle pa
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "L'output di produzione non deve essere specificato per l'ubicazione delle parti non tracciate"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Deve essere indicata l'allocazione dell'articolo"
 
@@ -1659,7 +1659,7 @@ msgstr "Articoli Opzionali"
 msgid "Allocate optional BOM items to build order"
 msgstr "Assegna gli elementi opzionali della distinta base all'ordine di produzione"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Distinta base (Bom)"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr "Ordinato"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr "Descrizione del progetto"
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Tasto impostazioni (deve essere univoco - maiuscole e minuscole)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Valore impostazioni"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "Il valore specificato non è un opzione valida"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "Il valore deve essere un valore booleano"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "Il valore deve essere un intero"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "La stringa chiave deve essere univoca"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Nessun gruppo"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Un dominio vuoto non è consentito."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Nome dominio non valido: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Riavvio richiesto"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "È stata modificata un'impostazione che richiede un riavvio del server"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Nome Istanza Del Server"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "Descrittore stringa per l'istanza del server"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Utilizza nome istanza"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Usa il nome dell'istanza nella barra del titolo"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Limita visualizzazione `Informazioni`"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Mostra la modalità `Informazioni` solo ai superusers"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Nome azienda"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Nome interno dell'azienda"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "URL Base"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "URL di base per l'istanza del server"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Valuta predefinita"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "giorni"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Scarica dall'URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Consenti il download di immagini e file remoti da URL esterno"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Limite Dimensione Download"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Dimensione massima consentita per il download dell'immagine remota"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "User-agent utilizzato per scaricare dall'URL"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "Consenti di sovrascrivere l'user-agent utilizzato per scaricare immagini e file da URL esterno (lasciare vuoto per il predefinito)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Richiesta conferma"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Richiede una conferma esplicita dell'utente per una determinata azione."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Profondità livelli"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Profondità predefinita per la visualizzazione ad albero. I livelli più in alto possono essere caricati più lentamente quando necessari."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Aggiorna intervallo di controllo"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Quanto spesso controllare gli aggiornamenti (impostare a zero per disabilitare)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Backup automatico"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Abilita il backup automatico di database e file multimediali"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Intervallo Di Backup Automatico"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Definisci i giorni intercorrenti tra un backup automatico e l'altro"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "I risultati delle attività in background verranno eliminati dopo un determinato numero di giorni"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "I log di errore verranno eliminati dopo il numero specificato di giorni"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Le notifiche dell'utente verranno eliminate dopo il numero di giorni specificato"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Supporto Codice A Barre"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Codice a barre inserito scaduto"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Tempo di ritardo di elaborazione codice a barre"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Codice a Barre Supporto Webcam"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Consenti la scansione del codice a barre tramite webcam nel browser"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr "Abilita il campo revisione per l'articolo"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "IPN Regex"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Schema di espressione regolare per l'articolo corrispondente IPN"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Consenti duplicati IPN"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Permetti a più articoli di condividere lo stesso IPN"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Permetti modifiche al part number interno (IPN)"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Consenti di modificare il valore del part number durante la modifica di un articolo"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Copia I Dati Della distinta base dell'articolo"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Copia i dati della Distinta Base predefinita quando duplichi un articolo"
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Copia I Dati Parametro dell'articolo"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Copia i dati dei parametri di default quando si duplica un articolo"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Copia I Dati dell'Articolo Test"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Copia i dati di prova di default quando si duplica un articolo"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Copia Template Parametri Categoria"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Copia i modelli dei parametri categoria quando si crea un articolo"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Modello"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Gli articoli sono modelli per impostazione predefinita"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Assemblaggio"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Gli articoli possono essere assemblate da altri componenti per impostazione predefinita"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Componente"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Gli articoli possono essere assemblati da altri componenti per impostazione predefinita"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Acquistabile"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Gli articoli sono acquistabili per impostazione predefinita"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Vendibile"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Gli articoli sono acquistabili per impostazione predefinita"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Tracciabile"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Gli articoli sono tracciabili per impostazione predefinita"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Virtuale"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Gli articoli sono virtuali per impostazione predefinita"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Mostra l'importazione nelle viste"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Mostra la procedura guidata di importazione in alcune viste articoli"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Mostra articoli correlati"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Visualizza parti correlate per ogni articolo"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Dati iniziali dello stock"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Consentire la creazione di uno stock iniziale quando si aggiunge una nuova parte"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Dati iniziali del fornitore"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Consentire la creazione dei dati iniziali del fornitore quando si aggiunge una nuova parte"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Formato di visualizzazione del nome articolo"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Formato per visualizzare il nome dell'articolo"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Icona predefinita Categoria Articolo"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Icona predefinita Categoria Articolo (vuoto significa nessuna icona)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Usa Prezzi Fornitore"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr "Includere le discontinuità di prezzo del fornitore nei calcoli generali dei prezzi"
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Ignora la Cronologia Acquisti"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr "Cronologia dei prezzi dell'ordine di acquisto del fornitore superati con discontinuità di prezzo"
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Utilizzare i prezzi degli articoli in stock"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "Utilizzare i prezzi dei dati di magazzino inseriti manualmente per il calcolo dei prezzi"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Età dei prezzi degli articoli in stock"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Escludere dal calcolo dei prezzi gli articoli in giacenza più vecchi di questo numero di giorni"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr "Utilizza Variazione di Prezzo"
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr "Includi la variante dei prezzi nei calcoli dei prezzi complessivi"
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Solo Varianti Attive"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr "Utilizza solo articoli di varianti attive per calcolare i prezzi delle varianti"
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr "Numero di giorni prima che il prezzo dell'articolo venga aggiornato automaticamente"
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Prezzi interni"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "Abilita prezzi interni per gli articoli"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Sovrascrivi Prezzo Interno"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr "Se disponibile, i prezzi interni sostituiscono i calcoli della fascia di prezzo"
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Abilita stampa etichette"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Abilita la stampa di etichette dall'interfaccia web"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "Etichetta Immagine DPI"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr "Risoluzione DPI quando si generano file di immagine da fornire ai plugin di stampa per etichette"
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Abilita Report di Stampa"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Abilita generazione di report di stampa"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Modalità Debug"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Genera report in modalità debug (output HTML)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Dimensioni pagina"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Dimensione predefinita della pagina per i report PDF"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Abilita Rapporto di Prova"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Abilita generazione di stampe di prova"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Allega Rapporto di Prova"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Quando si stampa un rapporto di prova, allegare una copia del rapporto di prova all'elemento di magazzino associato"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr "Seriali Unici Globali"
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "I numeri di serie per gli articoli di magazzino devono essere univoci"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Auto Riempimento Numeri Seriali"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Auto riempimento numeri nel modulo"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Elimina scorte esaurite"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Determina il comportamento predefinito quando un elemento stock è esaurito"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr "Modello Codice a Barre"
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Modello per la generazione di codici batch predefiniti per gli elementi stock"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Scadenza giacenza"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "Abilita funzionalità di scadenza della giacenza"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "Vendi giacenza scaduta"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "Consenti la vendita di stock scaduti"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Tempo di Scorta del Magazzino"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Numero di giorni in cui gli articoli in magazzino sono considerati obsoleti prima della scadenza"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Crea giacenza scaduta"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Permetti produzione con stock scaduto"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "Controllo della proprietà della giacenza"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Abilita il controllo della proprietà sulle posizioni e gli oggetti in giacenza"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr "Icona Predefinita Ubicazione di Magazzino"
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr "Icona Predefinita Ubicazione di Magazzino (vuoto significa nessuna icona)"
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Modello Di Riferimento Ordine Di Produzione"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Modello richiesto per generare il campo di riferimento ordine di produzione"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr "Modello Di Riferimento Ordine Di Vendita"
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr "Modello richiesto per generare il campo di riferimento ordine di vendita"
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr "Spedizione Predefinita Ordine Di Vendita"
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr "Abilita la creazione di spedizioni predefinite con ordini di vendita"
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr "Modifica Ordini Di Vendita Completati"
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr "Consenti la modifica degli ordini di vendita dopo che sono stati spediti o completati"
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr "Modello di Riferimento Ordine D'Acquisto"
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr "Modello richiesto per generare il campo di riferimento ordine di acquisto"
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Modifica Ordini Di Acquisto Completati"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr "Consenti la modifica degli ordini di acquisto dopo che sono stati spediti o completati"
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Abilita password dimenticata"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Abilita la funzione password dimenticata nelle pagine di accesso"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Abilita registrazione"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Abilita auto-registrazione per gli utenti nelle pagine di accesso"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "SSO abilitato"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "Abilita SSO nelle pagine di accesso"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "Abilita registrazione SSO"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr "Abilita l'auto-registrazione tramite SSO per gli utenti nelle pagine di accesso"
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Email richiesta"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr "Richiedi all'utente di fornire una email al momento dell'iscrizione"
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "Riempimento automatico degli utenti SSO"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Compila automaticamente i dettagli dell'utente dai dati dell'account SSO"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "Posta due volte"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "Al momento della registrazione chiedere due volte all'utente l'indirizzo di posta elettronica"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Password due volte"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "Al momento della registrazione chiedere agli utenti due volte l'inserimento della password"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Domini consentiti"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Gruppo iscrizione"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr "Gruppo a cui i nuovi utenti vengono assegnati al momento della registrazione"
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Applica MFA"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Gli utenti devono utilizzare la sicurezza a due fattori."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Controlla i plugin all'avvio"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr "Controlla che tutti i plugin siano installati all'avvio - abilita in ambienti contenitore"
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "Abilita l'integrazione URL"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "Attiva plugin per aggiungere percorsi URL"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr "Attiva integrazione navigazione"
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr "Abilita i plugin per l'integrazione nella navigazione"
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "Abilita l'app integrata"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "Abilita plugin per aggiungere applicazioni"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr "Abilita integrazione pianificazione"
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Abilita i plugin per eseguire le attività pianificate"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr "Abilita eventi integrati"
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr "Abilita plugin per rispondere agli eventi interni"
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr "Funzionalità Dell'Inventario"
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr "Abilita la funzionalità d'inventario per la registrazione dei livelli di magazzino e il calcolo del valore di magazzino"
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr "Inventario periodico automatico"
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr "Numero di giorni tra la registrazione automatica dell'inventario (imposta 0 per disabilitare)"
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr "I rapporti d'inventario verranno eliminati dopo il numero specificato di giorni"
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Tasto impostazioni (deve essere univoco - maiuscole e minuscole"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr "Nascondi Articoli Inattivi"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Mostra articoli sottoscritti"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Mostra gli articoli sottoscritti nella homepage"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Mostra le categorie sottoscritte"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Mostra le categorie dei componenti sottoscritti nella homepage"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Mostra ultimi articoli"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Mostra gli ultimi articoli sulla homepage"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Mostra distinta base non convalidata"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Mostra le distinte base che attendono la convalida sulla homepage"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Mostra le modifiche recenti alle giacenze"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Mostra le giacenze modificate di recente nella homepage"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Mostra disponibilità scarsa delle giacenze"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Mostra disponibilità scarsa degli articoli sulla homepage"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Mostra scorte esaurite"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Mostra disponibilità scarsa delle scorte degli articoli sulla homepage"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Mostra scorte necessarie"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Mostra le scorte degli articoli necessari per la produzione sulla homepage"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Mostra scorte esaurite"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Mostra gli articoli stock scaduti nella home page"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Mostra scorte obsolete"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Mostra gli elementi obsoleti esistenti sulla home page"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Mostra produzioni in attesa"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Mostra produzioni in attesa sulla homepage"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Mostra produzioni in ritardo"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Mostra produzioni in ritardo sulla home page"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr "Mostra ordini di produzione inevasi"
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr "Mostra ordini di produzione inevasi sulla home page"
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Mostra Ordini di Produzione in ritardo"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr "Mostra Ordini di Produzione in ritardo sulla home page"
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr "Mostra Ordini di Vendita inevasi"
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr "Mostra Ordini di Vendita inevasi sulla home page"
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Mostra Ordini di Vendita in ritardo"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr "Mostra Ordini di Vendita in ritardo sulla home page"
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Mostra Notizie"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Mostra notizie sulla home page"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "Visualizzazione dell'etichetta in linea"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "Visualizza le etichette PDF nel browser, invece di scaricare come file"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr "Stampante per etichette predefinita"
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr "Configura quale stampante di etichette deve essere selezionata per impostazione predefinita"
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr "Visualizzazione dell'etichetta in linea"
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "Visualizza le etichette PDF nel browser, invece di scaricare come file"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Cerca Articoli"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr "Mostra articoli della ricerca nella finestra di anteprima"
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr "Mostra articoli del fornitore nella finestra di anteprima"
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Cerca Articoli Produttore"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr "Mostra articoli del produttore nella finestra di anteprima"
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Nascondi Articoli Inattivi"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr "Escludi articoli inattivi dalla finestra di anteprima della ricerca"
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr "Cerca Categorie"
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr "Mostra categorie articolo nella finestra di anteprima di ricerca"
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Cerca Giacenze"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Mostra articoli in giacenza nella finestra di anteprima della ricerca"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Nascondi elementi non disponibili"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Escludi gli elementi stock che non sono disponibili dalla finestra di anteprima di ricerca"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Cerca Ubicazioni"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr "Mostra ubicazioni delle giacenze nella finestra di anteprima di ricerca"
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Cerca Aziende"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr "Mostra le aziende nella finestra di anteprima di ricerca"
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Cerca Ordini Di Produzione"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr "Mostra gli ordini di produzione nella finestra di anteprima di ricerca"
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Cerca Ordini di Acquisto"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr "Mostra gli ordini di acquisto nella finestra di anteprima di ricerca"
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Escludi Ordini D'Acquisto Inattivi"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr "Escludi ordini di acquisto inattivi dalla finestra di anteprima di ricerca"
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Cerca Ordini Di Vendita"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr "Visualizzazione degli ordini di vendita nella finestra di anteprima della ricerca"
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr "Escludi Ordini Di Vendita Inattivi"
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr "Escludi ordini di vendita inattivi dalla finestra di anteprima di ricerca"
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Cerca Ordini Di Reso"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "Risultati Dell'Anteprima Di Ricerca"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr "Numero di risultati da visualizzare in ciascuna sezione della finestra di anteprima della ricerca"
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Ricerca con regex"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Mostra quantità nei moduli"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "Visualizzare la quantità di pezzi disponibili in alcuni moduli"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr "Il tasto Esc chiude i moduli"
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr "Utilizzare il tasto Esc per chiudere i moduli modali"
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Barra di navigazione fissa"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr "La posizione della barra di navigazione è fissata nella parte superiore dello schermo"
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Formato Data"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Formato predefinito per visualizzare le date"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Programmazione Prodotto"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr "Mostra informazioni sulla pianificazione del prodotto"
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr "Inventario Prodotto"
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr "Visualizza le informazioni d'inventario dell'articolo (se la funzionalità d'inventario è abilitata)"
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr "Lunghezza Stringa Tabella"
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr "Quantità prezzo limite"
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr "Quantità prezzo limite"
 msgid "Price"
 msgstr "Prezzo"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr "Prezzo unitario in quantità specificata"
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Scadenza"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr "Scadenza in cui questa notifica viene ricevuta"
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr "Nome per questa notifica"
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr "Nome per questa notifica"
 msgid "Active"
 msgstr "Attivo"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr "È questa notifica attiva"
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Token"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Token per l'accesso"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Segreto"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr "Segreto condiviso per HMAC"
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "ID Messaggio"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr "Identificatore unico per questo messaggio"
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Host"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr "Host da cui questo messaggio è stato ricevuto"
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Intestazione"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "Intestazione di questo messaggio"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Contenuto"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr "Contenuto di questo messaggio"
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr "Scadenza in cui questo messaggio è stato ricevuto"
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr "Lavorato il"
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr "Il lavoro su questo messaggio è terminato?"
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Id"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Titolo"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Pubblicato"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Autore"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Riepilogo"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Letto"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr "Queste notizie sull'elemento sono state lette?"
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr "Queste notizie sull'elemento sono state lette?"
 msgid "Image"
 msgstr "Immagine"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "File immagine"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Articolo di base"
@@ -3977,7 +3985,7 @@ msgstr "Seleziona articolo"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Seleziona Produttore"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr "Valore del parametro"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr "L'articolo del costruttore collegato deve riferirsi alla stesso articolo
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "Fornitore"
 msgid "Select supplier"
 msgstr "Seleziona fornitore"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Unità di giacenza magazzino fornitore"
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr "Descrizione articolo fornitore"
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Nota"
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Onere minimo (ad esempio tassa di stoccaggio)"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr "Elimina immagine"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr "Nessuna informazione sul produttore disponibile"
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr "Nessuna informazione sul fornitore disponibile"
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr "Etichetta"
 msgid "Label template file"
 msgstr "File modello etichetta"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "Altezza [mm]"
 msgid "Label height, specified in mm"
 msgstr "Larghezza dell'etichetta, specificata in mm"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Formato del nome file"
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Filtri"
 
@@ -4846,11 +4854,11 @@ msgstr "Restituisci ordine"
 msgid "Total price for this order"
 msgstr "Prezzo totale dell'ordine"
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr "Ricevuto"
 msgid "Number of items received"
 msgstr "Numero di elementi ricevuti"
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr "Verificato Da"
 msgid "User who checked this shipment"
 msgstr "Utente che ha controllato questa spedizione"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Spedizione"
 
@@ -5141,7 +5149,7 @@ msgstr "Impossibile allocare stock a una riga senza un articolo"
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "La quantità di ripartizione non puo' superare la disponibilità della giacenza"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "La quantità deve essere 1 per l'elemento serializzato"
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "L'ordine non può essere cancellato"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr "Consenti di chiudere l'ordine con elementi di riga incompleti"
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr "L'ordine ha elementi di riga incompleti"
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "L'ordine non è aperto"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Valuta prezzo d'acquisto"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr "L'articolo del fornitore deve essere specificato"
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr "L'ordine di acquisto deve essere specificato"
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr "Il fornitore deve essere abbinato all'ordine d'acquisto"
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr "L'ordine di acquisto deve essere abbinato al fornitore"
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr "Elemento Riga"
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr "L'elemento di riga non corrisponde all'ordine di acquisto"
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr "Seleziona la posizione di destinazione per gli elementi ricevuti"
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr "Inserisci il codice univoco per gli articoli in arrivo"
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Inserisci i numeri di serie per gli articoli stock in arrivo"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Codice a Barre"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr "Codice a barre scansionato"
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "Il codice a barre è già in uso"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Deve essere fornita una quantità intera per gli articoli rintracciabili"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr "Gli elementi di linea devono essere forniti"
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr "La destinazione deve essere specificata"
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr "I valori dei codici a barre forniti devono essere univoci"
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr "Valuta prezzo di vendita"
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr "Nessun dettaglio di spedizione fornito"
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr "L'elemento di riga non è associato a questo ordine"
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr "La quantità deve essere positiva"
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Inserisci i numeri di serie da assegnare"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr "La spedizione è già stata spedita"
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr "La spedizione non è associata con questo ordine"
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr "Nessuna corrispondenza trovata per i seguenti numeri di serie"
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr "I seguenti numeri di serie sono già assegnati"
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr "Aggiornato {part} prezzo unitario a {price}"
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr "Aggiornato {part} unità prezzo a {price} e quantità a {qty}"
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "Codice Articolo"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Nome Articolo"
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr "IPN - Numero di riferimento interno"
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Revisione"
@@ -5869,8 +5877,8 @@ msgstr "Nome Principale"
 msgid "Category Path"
 msgstr "Percorso Categoria"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr "ID Elemento Distinta Base"
 msgid "Parent IPN"
 msgstr "IPN Principale"
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr "IPN Articolo"
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr "Prezzo Minimo"
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr "Convalida l'intera Fattura dei Materiali"
 msgid "This option must be selected"
 msgstr "Questa opzione deve essere selezionata"
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Posizione Predefinita"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Giacenze Totali"
@@ -6008,7 +6016,7 @@ msgstr "Giacenze Totali"
 msgid "Input quantity for price calculation"
 msgstr "Digita la quantità per il calcolo del prezzo"
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Categoria Articoli"
@@ -6090,7 +6098,7 @@ msgstr "Un articolo con questo Nome, IPN e Revisione esiste già."
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr "Gli articoli non possono essere assegnati a categorie articolo principali!"
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Nome articolo"
 
@@ -6424,604 +6432,610 @@ msgstr "Numero di articoli oggetto d'inventario"
 msgid "User who requested this stocktake report"
 msgstr "Utente che ha richiesto questo report inventario"
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr "Il modello di prova può essere creato solo per gli articoli rintracciabili"
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Test with this name already exists for this part"
+msgid "Test template with the same key already exists for part"
 msgstr "Una prova con questo nome esiste già per questo articolo"
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Nome Test"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr "Inserisci un nome per la prova"
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Descrizione Di Prova"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr "Inserisci descrizione per questa prova"
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Richiesto"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr "Questa prova è necessaria per passare?"
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Valore richiesto"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr "Questa prova richiede un valore quando si aggiunge un risultato di prova?"
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr "Allegato Richiesto"
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr "Questa prova richiede un file allegato quando si aggiunge un risultato di prova?"
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr "Il nome del modello del parametro deve essere univoco"
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr "Nome Parametro"
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr "Descrizione del parametro"
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr "Articolo principale"
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Modello Parametro"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Dati"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Valore del Parametro"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Valore Predefinito"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr "Valore Parametro Predefinito"
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr "ID articolo o nome articolo"
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr "Valore ID articolo univoco"
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr "Valore IPN articolo"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr "Livello"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr "Livello distinta base"
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr "Seleziona articolo principale"
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr "Articolo subordinato"
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr "Seleziona l'articolo da utilizzare nella Distinta Base"
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr "Quantità Distinta Base per questo elemento Distinta Base"
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr "Questo elemento della Distinta Base è opzionale"
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr "Questo elemento della Distinta Base è consumabile (non è tracciato negli ordini di produzione)"
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr "Eccedenza"
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Quantità stimata scarti di produzione (assoluta o percentuale)"
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr "Riferimento Elemento Distinta Base"
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr "Note Elemento Distinta Base"
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr "Codice di controllo"
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr "Codice di controllo Distinta Base"
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "Convalidato"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr "Questo elemento della Distinta Base viene ereditato dalle Distinte Base per gli articoli varianti"
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Consenti Le Varianti"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr "Gli elementi in giacenza per gli articoli varianti possono essere utilizzati per questo elemento Distinta Base"
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr "La quantità deve essere un valore intero per gli articoli rintracciabili"
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr "L'articolo subordinato deve essere specificato"
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr "Elemento Distinta Base Sostituito"
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr "La parte sostituita non può essere la stessa dell'articolo principale"
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr "Elemento principale Distinta Base"
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr "Sostituisci l'Articolo"
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr "Articolo 1"
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr "Articolo 2"
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr "Seleziona Prodotto Relativo"
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr "Non si può creare una relazione tra l'articolo e sé stesso"
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr "La relazione duplicata esiste già"
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Sottocategorie"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Valuta di acquisto di questo articolo in stock"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr "Articolo Originale"
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr "Seleziona l'articolo originale da duplicare"
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Copia immagine"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr "Copia immagine dall'articolo originale"
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr "Copia Distinta Base"
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr "Copia fattura dei materiali dall'articolo originale"
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Copia parametri"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr "Copia i dati dei parametri dall'articolo originale"
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr "Quantità iniziale"
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr "Specificare la quantità iniziale disponibile per questo Articolo. Se la quantità è zero, non viene aggiunta alcuna quantità."
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr "Ubicazione Iniziale Magazzino"
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr "Specificare l'ubicazione iniziale del magazzino per questo Articolo"
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr "Seleziona il fornitore (o lascia vuoto per saltare)"
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr "Seleziona il produttore (o lascia vuoto per saltare)"
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr "Codice articolo Produttore"
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr "L'azienda selezionata non è un fornitore valido"
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr "L'azienda selezionata non è un produttore valido"
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr "L'articolo del produttore che corrisponde a questo MPN esiste già"
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr "L'articolo del fornitore che corrisponde a questo SKU esiste già"
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "Collegamento esterno"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Allocate Stock"
 msgid "Unallocated Stock"
 msgstr "Assegna Scorte"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 #, fuzzy
 #| msgid "Part Stock"
 msgid "Variant Stock"
 msgstr "Articolo Stock"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "Duplica articolo"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr "Copia i dati iniziali da un altro Articolo"
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr "Stock iniziale"
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr "Crea Articolo con quantità di scorta iniziale"
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr "Informazioni Fornitore"
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr "Aggiungi le informazioni iniziali del fornitore per questo articolo"
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr "Copia Parametri Categoria"
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr "Copia i parametri dai modelli della categoria articolo selezionata"
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr "Limitare il report d'inventario ad un articolo particolare e a eventuali articoli varianti"
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr "Limita il report d'inventario ad una particolare categoria articolo, e a eventuali categorie secondarie"
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr "Limita il report d'inventario ad una particolare ubicazione di magazzino, e a eventuali ubicazioni secondarie"
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Genera Report"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr "Genera file di report contenente dati di inventario calcolati"
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr "Aggiorna Articoli"
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr "Aggiorna gli articoli specificati con i dati calcolati di inventario"
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr "La funzione Inventario non è abilitata"
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr "Aggiorna"
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr "Aggiorna i prezzi per questo articolo"
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr "Seleziona l'articolo da cui copiare la distinta base"
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr "Rimuovi Dati Esistenti"
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr "Rimuovi elementi distinta base esistenti prima di copiare"
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr "Includi Ereditato"
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr "Includi gli elementi Distinta Base ereditati da prodotti template"
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr "Salta Righe Non Valide"
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr "Abilita questa opzione per saltare le righe non valide"
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr "Copia Articoli sostitutivi"
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr "Copia articoli sostitutivi quando duplichi gli elementi distinta base"
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr "Cancella Distinta Base esistente"
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr "Rimuovi elementi distinta base esistenti prima del caricamento"
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr "Nessuna colonna articolo specificata"
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr "Trovati più articoli corrispondenti"
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr "Nessun articolo corrispondente trovato"
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr "L'articolo non è indicato come componente"
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr "Quantità non fornita"
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Quantità non valida"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr "Almeno un elemento della distinta base è richiesto"
 
@@ -8031,7 +8045,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8339,16 +8353,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "Nessun oggetto valido fornito nel modello"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr "Il file del modello '{template}' è mancante o non esiste"
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr "Report test"
 
@@ -8368,103 +8382,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Nome modello"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "File modello di report"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr "Descrizione del modello report"
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr "Numero di revisione del rapporto (auto-incrementi)"
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr "Sequenza per generare i nomi dei file report"
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr "Modello report abilitato"
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr "Filtri di ricerca elementi di stock (elenco separato da virgole key=coppia di valori)"
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr "Includi Test Installati"
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr "Includi i risultati dei test per gli elementi stock installati all'interno dell'elemento assemblato"
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr "Filtri di produzione"
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr "Filtri di ricerca produzione (elenco separato da virgole key=coppia di valori"
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Filtri Articolo"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr "Filtri di ricerca articolo (elenco separato da virgole key=coppia di valori"
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr "Ordine di Acquisto filtra la ricerca"
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr "Ordine di Vendita filtra la ricerca"
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Stock item with this serial number already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Esiste già un elemento stock con questo numero seriale"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Snippet"
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr "Report file snippet"
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr "Descrizione file snippet"
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Esiste già un allegato con questo nome di file"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr "Risorsa"
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr "Report file risorsa"
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr "File risorsa descrizione"
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8771,7 +8797,7 @@ msgstr "Non puoi rendere strutturale questa posizione di magazzino perché alcun
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr "Gli articoli di magazzino non possono essere ubicati in posizioni di magazzino strutturali!"
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr "Non è possibile creare un elemento di magazzino per articoli virtuali"
 
@@ -8816,7 +8842,7 @@ msgstr "Seleziona un fornitore articolo corrispondente per questo elemento di ma
 msgid "Where is this stock item located?"
 msgstr "Dove si trova questo articolo di magazzino?"
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr "Imballaggio di questo articolo di magazzino è collocato in"
 
@@ -8828,7 +8854,7 @@ msgstr "Questo elemento è stato installato su un altro elemento?"
 msgid "Serial number for this item"
 msgstr "Numero di serie per questo elemento"
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr "Codice lotto per questo elemento di magazzino"
 
@@ -8905,7 +8931,7 @@ msgstr "I numeri di serie devono essere numeri interi"
 msgid "Quantity does not match serial numbers"
 msgstr "La quantità non corrisponde ai numeri di serie"
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Numeri di serie già esistenti"
 
@@ -8937,7 +8963,7 @@ msgstr "L'elemento di magazzino è attualmente in produzione"
 msgid "Serialized stock cannot be merged"
 msgstr "Il magazzino serializzato non può essere unito"
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr "Duplica elementi di magazzino"
 
@@ -8985,184 +9011,184 @@ msgstr "Risultato della prova allegato"
 msgid "Test notes"
 msgstr "Note del test"
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr "Il numero di serie è troppo grande"
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr "Inserisci il numero di elementi di magazzino da serializzare"
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr "La quantità non deve superare la quantità disponibile ({q})"
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "Inserisci i numeri di serie per i nuovi elementi"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr "Posizione magazzino di destinazione"
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr "Note opzionali elemento"
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr "Numeri di serie non possono essere assegnati a questo articolo"
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr "Seleziona elementi di magazzino da installare"
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr "Aggiungi nota di transazione (opzionale)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr "Elemento di magazzino non disponibile"
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr "L'articolo selezionato non è nella Fattura dei Materiali"
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr "Posizione di destinazione per gli elementi disinstallati"
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr "Seleziona l'articolo in cui convertire l'elemento di magazzino"
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr "L'articolo selezionato non è una valida opzione per la conversione"
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr "Posizione di destinazione per l'elemento restituito"
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Sottoallocazioni"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr "L'articolo deve essere vendibile"
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr "L'elemento è assegnato a un ordine di vendita"
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr "Elemento assegnato a un ordine di costruzione"
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr "Cliente a cui assegnare elementi di magazzino"
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr "L'azienda selezionata non è un cliente"
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr "Note sull'assegnazione delle scorte"
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr "Deve essere fornito un elenco degli elementi di magazzino"
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr "Note di fusione di magazzino"
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr "Consenti fornitori non corrispondenti"
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr "Consenti di unire gli elementi di magazzino che hanno fornitori diversi"
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr "Consenti stato non corrispondente"
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr "Consenti di unire gli elementi di magazzino con diversi codici di stato"
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr "Devono essere riforniti almeno due elementi in magazzino"
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr "Valore di chiave primaria StockItem"
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr "Note sugli spostamenti di magazzino"
 
diff --git a/InvenTree/locale/ja/LC_MESSAGES/django.po b/InvenTree/locale/ja/LC_MESSAGES/django.po
index 4899f61711f5..1e6b707e1797 100644
--- a/InvenTree/locale/ja/LC_MESSAGES/django.po
+++ b/InvenTree/locale/ja/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Japanese\n"
@@ -30,20 +30,20 @@ msgstr "ユーザーにこのモデルを表示する権限がありません"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "値がありません"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr "日付を入力する"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "指定されたメールドメインは承認されていません。"
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "数量コードが無効です"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "シリアル番号は空です"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr ""
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "シリアル番号が見つかりません"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "この値からHTMLタグを削除"
 
@@ -401,7 +401,7 @@ msgstr "添付ファイル"
 msgid "Select file to attach"
 msgstr "添付ファイルを選択"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "コメント:"
 msgid "File comment"
 msgstr "ファイルコメント"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr "無効な選択です"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "お名前"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr ""
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "有効な数字でなければなりません"
 
@@ -678,7 +678,7 @@ msgstr "外部画像ファイルのURL"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "外部URLからの画像ダウンロードは許可されていません"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "バックグラウンドワーカーのチェックに失敗しました"
 
@@ -938,14 +938,14 @@ msgstr "InvenTree について"
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "組立状況"
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "シリアル番号"
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "外部URLからの画像ダウンロードを許可する"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "外部URL画像の最大サイズ"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "テンプレート"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "パーツはデフォルトのテンプレートです"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "アセンブリ"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "パーツはデフォルトで他のコンポーネントから組み立てることができます"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "コンポーネント"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "パーツはデフォルトでサブコンポーネントとして使用できます"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "購入可能"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "パーツはデフォルトで購入可能です"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "販売可能"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "パーツはデフォルトで販売可能です"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "追跡可能"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "パーツはデフォルトで追跡可能です"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "デバッグモード"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "シリアル番号を自動入力"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "メールアドレスは必須です"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr "非アクティブな部品を非表示"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "購読中の部品を表示"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "購読中のカテゴリを表示"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "メッセージ ID:"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "仕入先"
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "割り当てるシリアル番号を入力"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "パーツカテゴリ"
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,600 +6432,606 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "この名前の貼付ファイルは既に存在します"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "サブカテゴリ"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr "カテゴリを選択"
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "外部リンク"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8027,7 +8041,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8335,16 +8349,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8364,103 +8378,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "この名前の貼付ファイルは既に存在します"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "この名前の貼付ファイルは既に存在します"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8767,7 +8793,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8812,7 +8838,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8824,7 +8850,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8901,7 +8927,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "シリアル番号が既に存在します"
 
@@ -8933,7 +8959,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8981,184 +9007,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr "シリアル番号が大きすぎます"
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr "パーツは販売可能でなければなりません"
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/ko/LC_MESSAGES/django.po b/InvenTree/locale/ko/LC_MESSAGES/django.po
index b88c8b2fa993..5b57376f3de9 100644
--- a/InvenTree/locale/ko/LC_MESSAGES/django.po
+++ b/InvenTree/locale/ko/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Korean\n"
@@ -30,20 +30,20 @@ msgstr "이 모델을 볼 수 있는 권한이 없습니다."
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr ""
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "{original} 을 {unit} 으로 전환할 수 없음."
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr "날짜 입력"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr ""
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr ""
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr ""
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr ""
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr ""
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr ""
 
@@ -401,7 +401,7 @@ msgstr "첨부파일"
 msgid "Select file to attach"
 msgstr "첨부할 파일을 선택하세요"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr ""
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr ""
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "이름"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr ""
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "유효한 숫자여야 합니다"
 
@@ -678,7 +678,7 @@ msgstr "원격 이미지 파일의 URL"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "원격 URL 에서 이미지 다운로드가 활성화되지 않음"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Background worker 확인 실패"
 
@@ -938,14 +938,14 @@ msgstr ""
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "수량 값은 0보다 커야 합니다"
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "일련번호"
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "재시작 필요"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "회사명"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "기본 통화"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "URL에서 다운로드"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "바코드 지원"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "구입 가능"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "판매 가능"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "디버그 모드"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "페이지 크기"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "PDF 보고서 기본 페이지 크기"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "SSO 활성화"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "로그인 페이지에서 SSO 활성화"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "이메일 필요"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "두 번 보내기"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "작성자"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr "이미지"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "높이 [mm]"
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "바코드"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "이미 사용 중인 바코드입니다"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,600 +6432,606 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "같은 이름의 첨부파일이 이미 존재합니다"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "데이터"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "이미지 복사"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "외부 링크"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8027,7 +8041,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8335,16 +8349,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8364,103 +8378,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "같은 이름의 첨부파일이 이미 존재합니다"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "같은 이름의 첨부파일이 이미 존재합니다"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8767,7 +8793,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8812,7 +8838,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8824,7 +8850,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8901,7 +8927,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "일련번호가 이미 존재합니다"
 
@@ -8933,7 +8959,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8981,184 +9007,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/nl/LC_MESSAGES/django.po b/InvenTree/locale/nl/LC_MESSAGES/django.po
index 28689c4a0eaa..b95592787fa3 100644
--- a/InvenTree/locale/nl/LC_MESSAGES/django.po
+++ b/InvenTree/locale/nl/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Dutch\n"
@@ -30,20 +30,20 @@ msgstr "Gebruiker heeft geen rechten om dit model te bekijken"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Geen waarde opgegeven"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "{original} kon niet worden omgezet naar {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Ongeldige hoeveelheid ingegeven"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Ongeldige hoeveelheid ingegeven ({exc})"
@@ -65,9 +65,9 @@ msgstr "Voer datum in"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Het ingevoerde e-maildomein is niet goedgekeurd."
 msgid "Registration is disabled."
 msgstr "Registratie is uitgeschakeld."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Ongeldige hoeveelheid ingevoerd"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Leeg serienummer"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Duplicaat serienummer"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Geen serienummers gevonden"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Verwijder HTML tags van deze waarde"
 
@@ -401,7 +401,7 @@ msgstr "Bijlage"
 msgid "Select file to attach"
 msgstr "Bestand als bijlage selecteren"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Opmerking"
 msgid "File comment"
 msgstr "Bestand opmerking"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Dubbele namen kunnen niet bestaan onder hetzelfde bovenliggende object"
 msgid "Invalid choice"
 msgstr "Ongeldige keuze"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Naam"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Serverfout"
 msgid "An error has been logged by the server."
 msgstr "Er is een fout gelogd door de server."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Moet een geldig nummer zijn"
 
@@ -678,7 +678,7 @@ msgstr "URL van extern afbeeldingsbestand"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Afbeeldingen van externe URL downloaden is niet ingeschakeld"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Achtergrondwerker check is gefaald"
 
@@ -938,14 +938,14 @@ msgstr "Over InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Productie moet geannuleerd worden voordat het kan worden verwijderd"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Verbruiksartikelen"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Productieorderreferentie"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Productieorder waar deze productie aan is toegewezen"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Productieorder waar deze productie aan is toegewezen"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Productiestatus"
 msgid "Build status code"
 msgstr "Productiestatuscode"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Batchcode"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Productuitvoer komt niet overeen met de Productieorder"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Hoeveelheid moet groter zijn dan nul"
 
@@ -1285,10 +1285,10 @@ msgstr "Bouw object"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Bouw object"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Hoeveelheid moet 1 zijn voor geserialiseerde voorraad"
 msgid "Selected stock item does not match BOM line"
 msgstr "Geselecteerde voorraadartikelen komen niet overeen met de BOM-regel"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Hoeveelheid als geheel getal vereist voor traceerbare onderdelen"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Geheel getal vereist omdat de stuklijst traceerbare onderdelen bevat"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Serienummers"
@@ -1451,10 +1451,10 @@ msgstr "De volgende serienummers bestaan al of zijn ongeldig"
 msgid "A list of build outputs must be provided"
 msgstr "Een lijst van productieuitvoeren moet worden verstrekt"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Locatie van voltooide productieuitvoeren"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Accepteer dat voorraadartikelen niet volledig zijn toegewezen aan deze p
 msgid "Required stock has not been fully allocated"
 msgstr "Vereiste voorraad is niet volledig toegewezen"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Accepteer Onvolledig"
 
@@ -1602,11 +1602,11 @@ msgstr "Bouw lijn-item"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part moet naar hetzelfde onderdeel wijzen als de productieorder"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "Artikel moet op voorraad zijn"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Beschikbare hoeveelheid ({q}) overschreden"
@@ -1619,7 +1619,7 @@ msgstr "Productieuitvoer moet worden opgegeven voor de toewijzing van gevolgde o
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "Productieuitvoer kan niet worden gespecificeerd voor de toewijzing van niet gevolgde onderdelen"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Allocaties voor artikelen moeten worden opgegeven"
 
@@ -1659,7 +1659,7 @@ msgstr "Optionele Items"
 msgid "Allocate optional BOM items to build order"
 msgstr "Alloceer optionele BOM items om bestelling te bouwen"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Stuklijstartikel"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr "In bestelling"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr "Projectbeschrijving"
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Instellingssleutel (moet uniek zijn - hoofdletter ongevoelig)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Instellingswaarde"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "Gekozen waarde is geen geldige optie"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "Waarde moet een booleaanse waarde zijn"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "Waarde moet een geheel getal zijn"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "Sleutelreeks moet uniek zijn"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Geen groep"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Een leeg domein is niet toegestaan."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Ongeldige domeinnaam: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Geen plug-in gevonden"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Opnieuw opstarten vereist"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "Een instelling is gewijzigd waarvoor een herstart van de server vereist is"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Migraties in behandeling"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "ID Serverinstantie"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "Stringbeschrijving voor de server instantie"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Gebruik de instantie naam"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Gebruik de naam van de instantie in de titelbalk"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Tonen `over` beperken"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Toon de `over` modal alleen aan superusers"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Bedrijfsnaam"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Interne bedrijfsnaam"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "Basis-URL"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "Basis URL voor serverinstantie"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Standaard Valuta"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr "Selecteer basisvaluta voor de berekening van prijzen"
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "dagen"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Download van URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Download van afbeeldingen en bestanden vanaf een externe URL toestaan"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Download limiet"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Maximale downloadgrootte voor externe afbeelding"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "User-agent gebruikt om te downloaden van URL"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "Sta toe om de user-agent te overschrijven die gebruikt wordt om afbeeldingen en bestanden van externe URL te downloaden (laat leeg voor de standaard)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Bevestiging vereist"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Vereis expliciete bevestiging van de gebruiker voor bepaalde actie."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Boomstructuur Diepte"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Standaard diepte voor treeview. Diepere niveaus kunnen geladen worden wanneer ze nodig zijn."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Interval voor update"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Hoe vaak te controleren op updates (nul om uit te schakelen)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Automatische backup"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Automatische back-up van database- en mediabestanden inschakelen"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Automatische backup interval"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Geef het aantal dagen op tussen geautomatiseerde backup"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Interval Taak Verwijderen"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "Resultaten van achtergrondtaken worden verwijderd na het opgegeven aantal dagen"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr "Error Log Verwijderings Interval"
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "Resultaten van achtergrondtaken worden verwijderd na het opgegeven aantal dagen"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr "Interval Verwijderen Notificatie"
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Meldingen van gebruikers worden verwijderd na het opgegeven aantal dagen"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Streepjescodeondersteuning"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Barcode Invoer Vertraging"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Barcode invoerverwerking vertraging"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Barcode Webcam Ondersteuning"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Barcode via webcam scannen in browser toestaan"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr "Herzieningen onderdeel"
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr "Revisieveld voor onderdeel inschakelen"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "IPN Regex"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Regulier expressiepatroon voor het overeenkomende Onderdeel IPN"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Duplicaat IPN toestaan"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Toestaan dat meerdere onderdelen dezelfde IPN gebruiken"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Bewerken IPN toestaan"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Sta het wijzigen van de IPN toe tijdens het bewerken van een onderdeel"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Kopieer Onderdeel Stuklijstgegevens"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Kopieer standaard stuklijstgegevens bij het dupliceren van een onderdeel"
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Kopieer Onderdeel Parametergegevens"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Parametergegevens standaard kopiëren bij het dupliceren van een onderdeel"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Kopieer Onderdeel Testdata"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Testdata standaard kopiëren bij het dupliceren van een onderdeel"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Kopiëer Categorieparameter Sjablonen"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Kopieer categorieparameter sjablonen bij het aanmaken van een onderdeel"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Sjabloon"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Onderdelen zijn standaard sjablonen"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Samenstelling"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Onderdelen kunnen standaard vanuit andere componenten worden samengesteld"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Component"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Onderdelen kunnen standaard worden gebruikt als subcomponenten"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Koopbaar"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Onderdelen kunnen standaard gekocht worden"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Verkoopbaar"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Onderdelen kunnen standaard verkocht worden"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Volgbaar"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Onderdelen kunnen standaard gevolgd worden"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Virtueel"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Onderdelen zijn standaard virtueel"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Toon Import in Weergaven"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Toon de importwizard in sommige onderdelenweergaven"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Verwante onderdelen tonen"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Verwante onderdelen voor een onderdeel tonen"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Initiële voorraadgegevens"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Aanmaken van eerste voorraad toestaan bij het toevoegen van een nieuw onderdeel"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Initiële leveranciergegevens"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Aanmaken van eerste leveranciersgegevens toestaan bij het toevoegen van een nieuw onderdeel"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Onderdelennaam Weergaveopmaak"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Opmaak om de onderdeelnaam weer te geven"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Standaardicoon voor onderdeel catagorie"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Standaardicoon voor onderdeel catagorie (leeg betekent geen pictogram)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr "Forceer Parameter Eenheden"
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr "Als er eenheden worden opgegeven, moeten parameterwaarden overeenkomen met de opgegeven eenheden"
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr "Minimaal aantal prijs decimalen"
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr "Minimaal aantal decimalen om weer te geven bij het weergeven van prijsgegevens"
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr "Maximum prijs decimalen"
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr "Maximum aantal decimalen om weer te geven bij het weergeven van prijsgegevens"
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Gebruik leveranciersprijzen"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr "Prijsvoordelen leveranciers opnemen in de totale prijsberekening"
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Aankoopgeschiedenis overschrijven"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr "Historische order prijzen overschrijven de prijzen van de leverancier"
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Gebruik voorraaditem prijzen"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "Gebruik prijzen van handmatig ingevoerde voorraadgegevens voor prijsberekeningen"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Voorraad artikelprijs leeftijd"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Voorraaditems ouder dan dit aantal dagen uitsluiten van prijsberekeningen"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr "Gebruik variantprijzen"
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr "Variantenprijzen opnemen in de totale prijsberekening"
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Alleen actieve varianten"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr "Gebruik alleen actieve variantonderdelen voor het berekenen van variantprijzen"
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr "Prijzen Herbouw interval"
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr "Aantal dagen voordat de prijzen voor onderdelen automatisch worden bijgewerkt"
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Interne Prijzen"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "Inschakelen van interne prijzen voor onderdelen"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Interne prijs overschrijven"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr "Indien beschikbaar, interne prijzen overschrijven berekeningen van prijsbereik"
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Printen van labels Inschakelen"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Printen van labels via de webinterface inschakelen"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "Label Afbeelding DPI"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr "DPI resolutie bij het genereren van afbeelginsbestanden voor label printer plugins"
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Activeer Rapportages"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Activeer het genereren van rapporten"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Foutopsporingsmodus"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Rapporten genereren in debug modus (HTML uitvoer)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Paginagrootte"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Standaard paginagrootte voor PDF rapporten"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Activeer Testrapporten"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Activeer het genereren van testrapporten"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Testrapporten Toevoegen"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Bij het afdrukken van een Testrapport, voeg een kopie van het Testrapport toe aan het bijbehorende Voorraadartikel"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr "Globaal unieke serienummers"
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "Serienummers voor voorraaditems moeten globaal uniek zijn"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Serienummers automatisch invullen"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Automatisch invullen van serienummer in formulieren"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Verwijder uitgeputte voorraad"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Bepaalt standaard gedrag wanneer een voorraaditem is uitgeput"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr "Batchcode Sjabloon"
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Sjabloon voor het genereren van standaard batchcodes voor voorraadartikelen"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Verlopen Voorraad"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "Verlopen voorraad functionaliteit inschakelen"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "Verkoop Verlopen Voorraad"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "Verkoop verlopen voorraad toestaan"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Voorraad Vervaltijd"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Aantal dagen voordat voorraadartikelen als verouderd worden beschouwd voor ze verlopen"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Produceer Verlopen Voorraad"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Sta productie met verlopen voorraad toe"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "Voorraad Eigenaar Toezicht"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Eigenaarstoezicht over voorraadlocaties en items inschakelen"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr "Voorraadlocatie standaard icoon"
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr "Standaard locatie pictogram (leeg betekent geen icoon)"
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr "Geïnstalleerde voorraad items weergeven"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr "Geïnstalleerde voorraadartikelen in voorraadtabellen tonen"
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Productieorderreferentiepatroon"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Vereist patroon voor het genereren van het Bouworderreferentieveld"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr "Retourorders inschakelen"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr "Retourorder functionaliteit inschakelen in de gebruikersinterface"
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr "Retourorder referentie patroon"
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr "Verplicht patroon voor het genereren van Retour Order referentie veld"
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr "Bewerk voltooide retourorders"
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr "Bewerken van retourorders toestaan nadat deze zijn voltooid"
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr "Verkooporderreferentiepatroon"
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr "Vereist patroon voor het genereren van het Verkooporderreferentieveld"
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr "Standaard Verzending Verkooporder"
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr "Aanmaken standaard verzending bij verkooporders inschakelen"
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr "Bewerk voltooide verkooporders"
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr "Bewerken van verkooporders toestaan nadat deze zijn verzonden of voltooid"
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr "Inkooporderreferentiepatroon"
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr "Vereist patroon voor het genereren van het Inkooporderreferentieveld"
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Bewerk voltooide verkooporders"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr "Bewerken van inkooporders toestaan nadat deze zijn verzonden of voltooid"
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Wachtwoord vergeten functie inschakelen"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Wachtwoord vergeten functie inschakelen op de inlogpagina's"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Registratie inschakelen"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Zelfregistratie voor gebruikers op de inlogpagina's inschakelen"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "SSO inschakelen"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "SSO inschakelen op de inlogpagina's"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "Schakel gebruikersregistratie met SSO in"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr "Zelfregistratie voor gebruikers middels SSO op de inlogpagina's inschakelen"
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "E-mailadres verplicht"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr "Vereis gebruiker om e-mailadres te registreren bij aanmelding"
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "SSO-gebruikers automatisch invullen"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Gebruikersdetails van SSO-accountgegevens automatisch invullen"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "E-mail twee keer"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "Bij inschrijving gebruikers twee keer om hun e-mail vragen"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Wachtwoord tweemaal"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "Laat gebruikers twee keer om hun wachtwoord vragen tijdens het aanmelden"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Toegestane domeinen"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr "Inschrijven beperken tot bepaalde domeinen (komma-gescheiden, beginnend met @)"
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Groep bij aanmelding"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr "Groep waaraan nieuwe gebruikers worden toegewezen bij registratie"
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "MFA afdwingen"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Gebruikers moeten multifactor-beveiliging gebruiken."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Controleer plugins bij het opstarten"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr "Controleer of alle plug-ins zijn geïnstalleerd bij het opstarten - inschakelen in container-omgevingen"
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "Activeer URL-integratie"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "Plugins toestaan om URL-routes toe te voegen"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr "Activeer navigatie integratie"
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr "Plugins toestaan om te integreren in navigatie"
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "Activeer app integratie"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "Activeer plug-ins om apps toe te voegen"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr "Activeer planning integratie"
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Activeer plugin om periodiek taken uit te voeren"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr "Activeer evenement integratie"
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr "Activeer plugin om op interne evenementen te reageren"
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr "Activeer project codes"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr "Activeer project codes voor het bijhouden van projecten"
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr "Voorraadcontrole functionaliteit"
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr "Schakel voorraadfunctionaliteit in voor het opnemen van voorraadniveaus en het berekenen van voorraadwaarde"
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr "Externe locaties uitsluiten"
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr "Voorraadartikelen op externe locaties uitsluiten van voorraadberekeningen"
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr "Automatische Voorraadcontrole Periode"
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr "Aantal dagen tussen automatische voorraadopname (ingesteld op nul om uit te schakelen)"
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr "Rapport Verwijdering Interval"
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr "Voorraadrapportage zal worden verwijderd na het opgegeven aantal dagen"
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Instellingssleutel (moet uniek zijn - hoofdletter ongevoelig"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr "Inactieve Onderdelen Verbergen"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr "Verberg inactieve delen bij items op de homepage"
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Toon geabonneerde onderdelen"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Toon geabonneerde onderdelen op de homepage"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Toon geabonneerde categorieën"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Toon geabonneerde onderdeel categorieën op de startpagina"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Toon laatste onderdelen"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Toon laatste onderdelen op de startpagina"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Toon niet-gevalideerde BOM's"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Laat BOMs zien die wachten op validatie op de startpagina"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Toon recente voorraadwijzigingen"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Toon recent aangepaste voorraadartikelen op de startpagina"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Toon lage voorraad"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Toon lage voorraad van artikelen op de startpagina"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Toon lege voorraad"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Toon lege voorraad van artikelen op de startpagina"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Toon benodigde voorraad"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Toon benodigde voorraad van artikelen voor productie op de startpagina"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Toon verlopen voorraad"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Toon verlopen voorraad van artikelen op de startpagina"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Toon verouderde voorraad"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Toon verouderde voorraad van artikelen op de startpagina"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Toon openstaande producties"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Toon openstaande producties op de startpagina"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Toon achterstallige productie"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Toon achterstallige producties op de startpagina"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr "Toon uitstaande PO's"
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr "Toon uitstaande PO's op de startpagina"
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Toon achterstallige PO's"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr "Toon achterstallige PO's op de startpagina"
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr "Toon uitstaande SO's"
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr "Toon uitstaande SO's op de startpagina"
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Toon achterstallige SO's"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr "Toon achterstallige SO's op de startpagina"
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr "Toon in behandeling SO verzendingen"
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr "Toon in behandeling zijnde SO verzendingen op de startpagina"
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Nieuws tonen"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Nieuws op de startpagina weergeven"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "Inline labelweergave"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "PDF-labels in browser weergeven, in plaats van als bestand te downloaden"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr "Standaard label printer"
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr "Instellen welke label printer standaard moet worden geselecteerd"
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr "Inline rapport weergeven"
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "PDF-rapporten in de browser weergeven, in plaats van als bestand te downloaden"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Zoek Onderdelen"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr "Onderdelen weergeven in zoekscherm"
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr "Zoek leveranciersonderdelen"
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr "Leveranciersonderdelen weergeven in zoekscherm"
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Fabrikant onderdelen zoeken"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr "Fabrikant onderdelen weergeven in zoekscherm"
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Inactieve Onderdelen Verbergen"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr "Inactieve verkooporders weglaten in het zoekvenster"
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr "Zoek categorieën"
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr "Toon onderdeelcategorieën in zoekvenster"
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Zoek in Voorraad"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Toon voorraad items in zoekvenster"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Verberg niet beschikbare voorraad items"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Voorraadartikelen die niet beschikbaar zijn niet in het zoekvenster weergeven"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Locaties doorzoeken"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr "Toon voorraadlocaties in zoekvenster"
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Zoek bedrijven"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr "Toon bedrijven in zoekvenster"
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Zoek Bouworders"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr "Toon bouworders in zoekvenster"
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Inkooporders Zoeken"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr "Toon inkooporders in het zoekvenster"
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Inactieve Inkooporders Weglaten"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr "Inactieve inkooporders weglaten in het zoekvenster"
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Verkooporders zoeken"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr "Toon verkooporders in het zoekvenster"
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr "Inactieve Verkooporders Weglaten"
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr "Inactieve verkooporders weglaten in het zoekvenster"
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Zoek retourorders"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr "Toon bouworders in zoekvenster"
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr "Inactieve retourbestellingen weglaten"
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr "Inactieve retourorders uitsluiten in zoekvenster"
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "Zoekvoorbeeld resultaten"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr "Aantal resultaten om weer te geven in elk gedeelte van het zoekvenster"
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Regex zoeken"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr "Schakel reguliere expressies in zoekopdrachten in"
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr "Hele woorden zoeken"
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr "Zoekopdrachten geven resultaat voor hele woord overeenkomsten"
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Toon hoeveelheid in formulieren"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "Hoeveelheid beschikbare onderdelen in sommige formulieren weergeven"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr "Escape-toets sluit formulieren"
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr "Gebruik de Escape-toets om standaard formulieren te sluiten"
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Vaste navigatiebalk"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr "De navigatiebalk positie is gefixeerd aan de bovenkant van het scherm"
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Datum formaat"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Voorkeursindeling voor weergave van datums"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Onderdeel planning"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr "Toon informatie voor het plannen van onderdelen"
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr "Voorraadcontrole onderdeel"
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr "Toon voorraadinformatie van onderdeel (als voorraadcontrole functionaliteit is ingeschakeld)"
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr "Tabel tekenreekslengte"
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr "Standaard sjabloon product onderdeel"
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr "Het onderdeellabelsjabloon dat automatisch wordt geselecteerd"
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr "Standaard sjabloon voorraad onderdeel"
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr "Standaard label van voorraadlocatie"
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr "Foutrapportages ontvangen"
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr "Meldingen ontvangen van systeemfouten"
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr "Prijs"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Eindpunt"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr "Eindpunt waarop deze webhook wordt ontvangen"
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr "Naam van deze webhook"
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr "Naam van deze webhook"
 msgid "Active"
 msgstr "Actief"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr "Is deze webhook actief"
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Token"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Token voor toegang"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Geheim"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr "Gedeeld geheim voor HMAC"
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "Bericht ID"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Host"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Koptekst"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "Koptekst van dit bericht"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Berichtinhoud"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr "Inhoud van dit bericht"
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr "Aan gewerkt"
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Id"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Titel"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Gepubliceerd"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Samenvatting"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Gelezen"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr "Afbeelding"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "Afbeelding"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr "Symbool"
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr "Definitie"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Basis onderdeel"
@@ -3977,7 +3985,7 @@ msgstr "Onderdeel selecteren"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Fabrikant selecteren"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr "Parameterwaarde"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr "Gekoppeld fabrikant onderdeel moet verwijzen naar hetzelfde basis onderd
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "Leverancier"
 msgid "Select supplier"
 msgstr "Leverancier selecteren"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Opmerking"
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Minimale kosten (bijv. voorraadkosten)"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr "Geen fabrikanten informatie beschikbaar"
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr "Geen leveranciersinformatie beschikbaar"
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr "Label"
 msgid "Label template file"
 msgstr "Label template bestand"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "Hoogte [mm]"
 msgid "Label height, specified in mm"
 msgstr "Label hoogte, gespecificeerd in mm"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Bestandsnaam Patroon"
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Filters"
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr "Ontvangen"
 msgid "Number of items received"
 msgstr "Aantal ontvangen artikelen"
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr "Gecontroleerd door"
 msgid "User who checked this shipment"
 msgstr "Gebruiker die deze zending gecontroleerd heeft"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Zending"
 
@@ -5141,7 +5149,7 @@ msgstr "Kan voorraad niet toewijzen aan een regel zonder onderdeel"
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "Toewijzingshoeveelheid kan niet hoger zijn dan de voorraadhoeveelheid"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Hoeveelheid moet 1 zijn voor geserialiseerd voorraadartikel"
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "Order kan niet worden geannuleerd"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "Order is niet open"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Valuta Inkoopprijs"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr "Leveranciersonderdeel moet worden gespecificeerd"
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr "Inkooporder moet worden gespecificeerd"
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr "De leverancier moet overeenkomen met de inkooporder"
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr "Inkooporder moet overeenkomen met de leverancier"
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr "Artikel"
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr "Artikelregel komt niet overeen met inkooporder"
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr "Selecteer bestemmingslocatie voor ontvangen artikelen"
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Voer serienummers in voor inkomende voorraadartikelen"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "Streepjescode is al in gebruik"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Hoeveelheid als geheel getal vereist voor traceerbare onderdelen"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr "Artikelen moeten worden opgegeven"
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr "Bestemmingslocatie moet worden opgegeven"
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr "Geleverde streepjescodewaarden moeten uniek zijn"
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr "Valuta verkoopprijs"
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr "Geen verzenddetails opgegeven"
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr "Artikelregel is niet gekoppeld aan deze bestelling"
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr "Hoeveelheid moet positief zijn"
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Voer serienummers in om toe te wijzen"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr "Verzending is al verzonden"
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr "Zending is niet gekoppeld aan deze bestelling"
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr "Geen overeenkomst gevonden voor de volgende serienummers"
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr "De volgende serienummers zijn al toegewezen"
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr "{part} stukprijs bijgewerkt naar {price}"
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr "{part} stukprijs bijgewerkt naar {price} en aantal naar {qty}"
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "Onderdeel-id"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Onderdeel naam"
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Standaard locatie"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Totale Voorraad"
@@ -6008,7 +6016,7 @@ msgstr "Totale Voorraad"
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Onderdeel Categorie"
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Onderdeel naam"
 
@@ -6424,604 +6432,610 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Bijlage met deze bestandsnaam bestaat al"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr "De template van de parameter moet uniek zijn"
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr "Parameternaam"
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Parameter Template"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Parameterwaarde"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr "Standaard Parameter Waarde"
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr "Geen onderdelen geselecteerd"
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Afbeelding kopiëren"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr "Afbeelding kopiëren van het oorspronkelijke onderdeel"
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Parameters kopiëren"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr "Parameter data kopiëren van het originele onderdeel"
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "Externe Link"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Deallocate Stock"
 msgid "Unallocated Stock"
 msgstr "Voorraad niet meer toewijzen"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 #, fuzzy
 #| msgid "Part Stocktake"
 msgid "Variant Stock"
 msgstr "Voorraadcontrole onderdeel"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Ongeldige hoeveelheid"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8031,7 +8045,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8339,16 +8353,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8368,103 +8382,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr "Filters inkooporder"
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr "Verkooporder zoekopdracht filters"
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Bijlage met deze bestandsnaam bestaat al"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Bijlage met deze bestandsnaam bestaat al"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8771,7 +8797,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8816,7 +8842,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8828,7 +8854,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8905,7 +8931,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8937,7 +8963,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8985,184 +9011,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Sublocaties"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr "Artikel is toegewezen aan een verkooporder"
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr "Artikel is toegewezen aan een productieorder"
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/no/LC_MESSAGES/django.po b/InvenTree/locale/no/LC_MESSAGES/django.po
index a21d14eb30f0..fc3fef2574e6 100644
--- a/InvenTree/locale/no/LC_MESSAGES/django.po
+++ b/InvenTree/locale/no/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Norwegian\n"
@@ -30,20 +30,20 @@ msgstr "Brukeren har ikke rettigheter til å se denne modellen"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Ingen verdi angitt"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Kunne ikke konvertere {original} til {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Ugyldig mengde oppgitt"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Ugyldig mengde oppgitt ({exc})"
@@ -65,9 +65,9 @@ msgstr "Oppgi dato"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Det oppgitte e-postdomenet er ikke godkjent."
 msgid "Registration is disabled."
 msgstr "Registrering er deaktivert."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Ugyldig mengde oppgitt"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Tom serienummerstreng"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Duplisert serienummer"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Ugyldig gruppesekvens: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Gruppesekvens {group} overskrider tillatt antall ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Ugyldig gruppesekvens: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Ingen serienummer funnet"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Antall unike serienumre ({len(serials)}) må samsvare med antallet ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Fjern HTML-tagger fra denne verdien"
 
@@ -401,7 +401,7 @@ msgstr "Vedlegg"
 msgid "Select file to attach"
 msgstr "Velg fil å legge ved"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Kommentar"
 msgid "File comment"
 msgstr "Kommentar til fil"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Duplikatnavn kan ikke eksistere under samme overordnede"
 msgid "Invalid choice"
 msgstr "Ugyldig valg"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Navn"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Serverfeil"
 msgid "An error has been logged by the server."
 msgstr "En feil har blitt logget av serveren."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Må være et gyldig tall"
 
@@ -678,7 +678,7 @@ msgstr "URLtil ekstern bildefil"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Nedlasting av bilder fra ekstern URL er ikke aktivert"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Sjekk av bakgrunnsarbeider mislyktes"
 
@@ -938,14 +938,14 @@ msgstr "Om InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Produksjonen må avbrytes før den kan slettes"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Forbruksvare"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Produksjonsordre-referanse"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Produksjonsordre som denne produksjonen er tildelt"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Produksjonsordre som denne produksjonen er tildelt"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Produksjonsstatus"
 msgid "Build status code"
 msgstr "Produksjonsstatuskode"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Batchkode"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Produksjonsartikkelen samsvarer ikke med produksjonsordren"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Mengden må være større enn null"
 
@@ -1285,10 +1285,10 @@ msgstr "Produksjonsobjekt"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Produksjonsobjekt"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Mengden må være 1 for serialisert lagervare"
 msgid "Selected stock item does not match BOM line"
 msgstr "Valgt lagervare samsvarer ikke med BOM-linjen"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Heltallsverdi kreves for sporbare deler"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Heltallsverdi kreves, da stykklisten inneholder sporbare deler"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Serienummer"
@@ -1451,10 +1451,10 @@ msgstr "Følgende serienummer finnes allerede eller er ugyldige"
 msgid "A list of build outputs must be provided"
 msgstr "En liste over produksjonsartikler må oppgis"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Plassering for ferdige produksjonsartikler"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Godta at lagervarer ikke er fullt tildelt til denne produksjonsordren"
 msgid "Required stock has not been fully allocated"
 msgstr "Nøvendig lagerbeholdning er ikke fullt tildelt"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Godta uferdig"
 
@@ -1602,11 +1602,11 @@ msgstr "Produksjonsartikkel"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part må peke på den samme delen som produksjonsordren"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "Artikkelen må være på lager"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Tilgjengelig antall ({q}) overskredet"
@@ -1619,7 +1619,7 @@ msgstr "Produksjonsartikkel må spesifiseres for tildeling av sporede deler"
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "Produksjonsartikkel kan ikke spesifiseres for tildeling av usporede deler"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Tildelingsartikler må oppgis"
 
@@ -1659,7 +1659,7 @@ msgstr "Valgfrie artikler"
 msgid "Allocate optional BOM items to build order"
 msgstr "Tildel valgfrie BOM-artikler til produksjonsordre"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "BOM-artikkel"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr "Tildelt lagerbeholdning"
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr "Tildelt lagerbeholdning"
 msgid "On Order"
 msgstr "I bestilling"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr "I produksjon"
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr "Prosjektbeskrivelse"
 msgid "User or group responsible for this project"
 msgstr "Bruker eller gruppe ansvarlig for dette prosjektet"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Innstillingsnøkkel (må være unik - ufølsom for store of små bokstaver)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Innstillings verdi"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "Valgt verdi er ikke et gyldig alternativ"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "Verdien må være en boolsk verdi"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "Verdien må være et heltall"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "Nøkkelstreng må være unik"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Ingen gruppe"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Et tomt domene er ikke tillatt."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Ugyldig domenenavn: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Ingen programtillegg"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Omstart kreves"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "En innstilling har blitt endret som krever en omstart av serveren"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Ventende migrasjoner"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr "Antall ventende databasemigreringer"
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Navn på serverinstans"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "Strengbeskrivelse for serverinstansen"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Bruk instansnavn"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Bruk instansnavnet på tittellinjen"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Begrens visning av 'om'"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Vis `about`-modal kun til superbrukere"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Firmanavn"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Internt firmanavn"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "Base-URL"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "Base-URL for serverinstans"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Standardvaluta"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr "Velg grunnvalutaen for prisberegninger"
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr "Oppdateringsintervall for valuta"
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr "Hvor ofte valutakurser skal oppdateres (sett til null for å deaktiverere)"
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "dager"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr "Valutaoppdaterings-plugin"
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr "Valgt valutaoppdaterings-plugin"
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Last ned fra URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Tillat nedlastning av eksterne bilder og filer fra ekstern URL"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Nedlastingsgrense"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Maksimal tillatt nedlastingsstørrelse for eksternt bilde"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "User-Agent brukt for å laste ned fra URL"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "Tillat overstyring av User-Agent brukt for å laste ned bilder og filer fra eksterne URLer (lå stå blank for standard)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr "Streng URL-validering"
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr "Krev skjemaspesifikasjon ved validering av URLer"
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Krev bekreftelse"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Krev eksplisitt brukerbekreftelse for visse handlinger."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Tredybde"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Standard tredybde for trevisning. Dypere nivåer kan lastes inn ved behov."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Intervall for oppdateringssjekk"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Tidsintervall for å se etter oppdateringer(sett til null for å skru av)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Automatisk sikkerhetskopiering"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Aktiver automatisk sikkerhetskopiering av database og mediafiler"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Automatisk sikkerhetskopieringsintervall"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Angi antall dager mellom automatiske sikkerhetskopieringshendelser"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Slettingsintervall for oppgaver"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "Bakgrunnsoppgaveresultater vil bli slettet etter antall angitte dager"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr "Slettingsintervall for feillogg"
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "Feilloggene vil bli slettet etter et angitt antall dager"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr "Slettingsintervall for varsler"
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Brukervarsler slettes etter angitt antall dager"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Strekkodestøtte"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr "Aktiver støtte for strekkodeleser i webgrensesnittet"
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Innlesingsforsinkelse for strekkode"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Tidsforsinkelse for behandling av strekkode"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Støtte for strekkodewebkamera"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Tillat strekkodelesning via webkamera i nettleseren"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr "Delrevisjoner"
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr "Aktiver revisjonsfeltet for Del"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "IPN regex"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Regulært uttrykksmønster for matching av internt delnummer"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Tilat duplikat av internt delnummer"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Tillat flere deler å dele samme interne delnummer"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Tillat redigering av internt delnummer"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Tillat endring av IPN-verdien mens du redigerer en del"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Kopier BOM-data fra del"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Kopier BOM-data som standard når du dupliserer en del"
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Kopier parameterdata fra del"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Kopier parameterdata som standard ved duplisering av en del"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Kopier testdata fra del"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Kopier testdata som standard ved duplisering av en del"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Kopier designmaler for kategoriparametere"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Kopier parametermaler for kategori ved oppretting av en del"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Mal"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Deler er maler som standard"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Sammenstilling"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Deler kan settes sammen fra andre komponenter som standard"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Komponent"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Deler kan bli brukt som underkomponenter som standard"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Kjøpbar"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Deler er kjøpbare som standard"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Salgbar"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Deler er salgbare som standard"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Sporbar"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Deler er sporbare som standard"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Virtuelle"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Deler er virtuelle som standard"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Vis import i visninger"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Vis importveiviseren i noen deler visninger"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Vis relaterte deler"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Vis relaterte deler i en del"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Innledende lagerbeholdningsdata"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Tillat oppretting av innledende lagerbeholdning når en ny del opprettes"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Innledende leverandørdata"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Tillat oppretting av innledende leverandørdata når en ny del opprettes"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Visningsformat for delnavn"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Format for å vise delnavnet"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Standardikon for delkategorier"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Standardikon for delkategorier (tomt betyr ingen ikon)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr "Tving parameterenheter"
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr "Hvis det er angitt en enhet, skal parameterverdiene samsvare med de angitte enhetene"
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr "Minimum antall desimalplasser for priser"
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr "Minimum antall desimalplasser som skal vises når man gjengir prisdata"
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr "Maksimalt antall desimalplasser for priser"
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr "Maksimalt antall desimalplasser som skal vises når man gjengir prisdata"
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Bruk leverandørpriser"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr "Inkluder leverandørprisbrudd i beregninger av totalpriser"
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Innkjøpshistorikkoverstyring"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr "Historiske innkjøpspriser overstyrer leverandørprisnivåer"
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Bruk lagervarepriser"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "Bruk priser fra manuelt innlagte lagervarer for prisberegninger"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Lagervare prisalder"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Unnta lagervarer som er eldre enn dette antall dager fra prisberegninger"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr "Bruk Variantpriser"
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr "Inkluder variantpriser i beregninger av totale priser"
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Kun aktive varianter"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr "Bruk kun aktive variantdeler til beregning av variantprising"
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr "Intervall for rekalkulering av priser"
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr "Antall dager før delpriser blir automatisk oppdatert"
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Interne Priser"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "Aktiver interne priser for deler"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Intern prisoverstyring"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr "Hvis tilgjengelig, overstyrer interne priser kalkulering av prisområde"
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Aktiver etikettutskrift"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Aktiver utskrift av etiketter fra nettleseren"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "Etikettbilde-DPI"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr "DPI-oppløsning når når det genereres bildefiler for sending til utvidelser for etikettutskrift"
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Aktiver Rapporter"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Aktiver generering av rapporter"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Feilsøkingsmodus"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Generer rapporter i feilsøkingsmodus (HTML-output)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Sidestørrelse"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Standard sidestørrelse for PDF-rapporter"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Aktiver Testrapporter"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Aktiver generering av testrapporter"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Legg ved testrapporter"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Når det skrives ut en Testrapport, legg ved en kopi av Testrapporten på den assosierte Lagervaren"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr "Globalt Unike Serienummer"
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "Serienummer for lagervarer må være globalt unike"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Automatisk tildeling av Serienummer"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Aumatisk fyll ut serienummer i skjemaer"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Slett oppbrukt lagerbeholdning"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Bestemmer standard oppførsel når en lagervare er oppbrukt"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr "Batchkodemal"
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Mal for generering av standard batchkoder for lagervarer"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Lagerbeholdning utløper"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "Aktiver funksjonalitet for utløp av lagerbeholdning"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "Selg utløpt lagerbeholdning"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "Tillat salg av utgått lagerbeholdning"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Foreldet lagerbeholdning tidsintervall"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Antall dager før lagervarer er ansett som foreldet før utløp"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Produsér Utløpt Lagerbeholdning"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Tillat produksjon med utløpt lagerbeholdning"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "Kontroll over eierskap av lagerbeholdning"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Aktiver eierskap over lagerplasseringer og -varer"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr "Lagerplassering standard ikon"
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr "Lagerplassering standard ikon (tomt betyr ingen ikon)"
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr "Vis installerte lagervarer"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr "Vis installerte lagervarer i lagertabeller"
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Produksjonsordre-referansemønster"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Nødvendig mønster for å generere Produksjonsordre-referansefeltet"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr "Aktiver returordrer"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr "Aktiver returordrefunksjonalitet i brukergrensesnittet"
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr "Returordre-referansemønster"
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr "Påkrevd mønster for å generere returordrereferansefelt"
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr "Rediger fullførte returordrer"
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr "Tillat redigering av returordrer etter de er fullført"
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr "Salgsordre-referansemønster"
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr "Påkrevd mønster for å generere salgsordrereferansefelt"
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr "Salgsordre standard fraktmetode"
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr "Aktiver opprettelse av standard forsendelse med salgsordrer"
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr "Rediger fullførte salgsordrer"
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr "Tillat redigering av salgsordrer etter de har blitt sendt eller fullført"
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr "Referansemønster for innkjøpsordre"
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr "Obligatorisk mønster for generering av referansefelt for innkjøpsordre"
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Rediger fullførte innkjøpsordre"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr "Tillat redigering av innkjøpsordre etter at de har blitt sendt eller fullført"
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr "Autofullfør innkjøpsordrer"
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr "Automatisk merk innkjøpsordre som fullført når alle ordrelinjer er mottatt"
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Aktiver passord glemt"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Ativer funskjon for glemt passord på innloggingssidene"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Aktiver registrering"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Aktiver egenregistrerting for brukerer på påloggingssidene"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "Aktiver SSO"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "Aktiver SSO på innloggingssidene"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "Aktiver SSO-registrering"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr "Aktiver selvregistrering via SSO for brukere på innloggingssiden"
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "E-postadresse kreves"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr "Krevt at brukere angir e-post ved registrering"
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "Auto-utfyll SSO-brukere"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Fyll automatisk ut brukeropplysninger fra SSO-kontodata"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "E-post to ganger"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "Spør brukeren om e-post to ganger ved registrering"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Passord to ganger"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "Spør brukeren om passord to ganger ved registrering"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Tillatte domener"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr "Begrens registrering til bestemte domener (kommaseparert, begynner med @)"
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Gruppe ved registrering"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr "Gruppe nye brukere blir tilknyttet ved registrering"
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Krev MFA"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Brukere må bruke flerfaktorsikkerhet."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Sjekk utvidelser ved oppstart"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr "Sjekk at alle utvidelser er installert ved oppstart - aktiver i containermiljøer"
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "Aktiver URL-integrasjon"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "Tillat utvidelser å legge til URL-ruter"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr "Aktiver navigasjonsintegrasjon"
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr "Tillat utvidelser å integrere mot navigasjon"
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "Aktiver app-integrasjon"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "Tillat utvidelser å legge til apper"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr "Aktiver tidsplanintegrasjon"
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Tillat utvidelser å kjøre planlagte oppgaver"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr "Aktiver hendelsesintegrasjon"
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr "Tillat utvidelser å reagere på interne hendelser"
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr "Aktiver prosjektkoder"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr "Aktiver prosjektkoder for å spore prosjekter"
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr "Varetellingsfunksjonalitet"
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr "Aktiver varetellingsfunksjonalitet for å registrere lagernivåer og regne ut lagerverdi"
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr "Ekskluder eksterne plasseringer"
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr "Eksluder lagervarer i eksterne plasseringer fra varetellinger"
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr "Automatisk varetellingsperiode"
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr "Antall dager mellom automatisk varetellingsregistrering (sett til null for å deaktivere)"
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr "Rapportslettingsintervall"
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr "Varetellingsrapporter vil slettes etter angitt antall dager"
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr "Vis brukernes fulle navn"
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr "Vis brukernes fulle navn istedet for brukernavn"
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Innstillingsnøkkel (må være unik - ufølsom for store og små bokstaver"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr "Skjul inaktive elementer"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr "Skjul inaktive deler i resultater som vises på hjemmesiden"
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Vis abonnerte deler"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Vis abonnerte deler på startsiden"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Vis abonnerte kategorier"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Vis abonnerte delkatekorier på startsiden"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Vis nyeste deler"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Vis nyeste deler på startsiden"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Vis uvaliderte stykklister"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Vis stykklister som venter på validering på startsiden"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Vis nylige lagerendringer"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Vis nylig endrede lagervarer på startsiden"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Vis lav lagerbeholdning"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Vis lave lagervarer på startsiden"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Vis tomme lagervarer"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Vis tom lagerbeholdning på startsiden"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Vis nødvendig lagerbeholdning"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Vis lagervarer som trengs for produksjon på startsiden"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Vis utløpt lagerbeholdning"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Vis utløpte lagervarer på startsiden"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Vis foreldet lagerbeholdning"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Vis foreldet lagerbeholdning på startsiden"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Vis ventende produksjoner"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Vi ventende produksjoner på startsiden"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Vis forfalte produksjoner"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Vis forfalte produksjoner på startsiden"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr "Vis utestående Innkjøpsordrer"
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr "Vis utestående Innkjøpsordrer på startsiden"
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Vis forfalte Innkjøpsordrer"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr "Vis forfalte Innkjøpsordrer på startsiden"
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr "Vis utestående Salgsordrer"
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr "Vis utestående Salgsordrer på startsiden"
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Vis forfalte SOer"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr "Vis forfalte SOer på startsiden"
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr "Vis ventende SO-forsendelser"
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr "Vis ventende SO-forsendelser på startsiden"
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Vis Nyheter"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Vis nyheter på startsiden"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "Innebygd etikettvisning"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "Vis PDF-etiketter i nettleseren fremfor å lastes ned som en fil"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr "Standard etikettskriver"
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr "Konfigurer hvilken etikettskriver som skal være valgt som standard"
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr "Innebygd rapportvisning"
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "Vis PDF-rapporter i nettleseren fremfor å lastes ned som en fil"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Søk i Deler"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr "Vis deler i forhåndsvsningsvinduet for søk"
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr "Søk i Leverandørdeler"
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr "Vis leverandørdeler i forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Søk i Produsentdeler"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr "Vis produsentdeler i forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Skjul Inaktive Deler"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr "Ekskluder inaktive deler fra forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr "Søk i kategorier"
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr "Vis delkategorier i forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Søk i lagerbeholdning"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Vis lagervarer i forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Skjul utilgjengelige Lagervarer"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Ekskluder lagervarer som ikke er tilgjengelige fra forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Søk i Plasseringer"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr "Vis lagerplasseringer i forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Søk i Firma"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr "Vis firma i forhåndsvsningsvinduet for søk"
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Søk i Produksjonsordrer"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr "Vis produksjonsordrer i forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Søk i Innkjøpsordrer"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr "Vis innkjøpsordrer i forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Ekskluder inaktive Innkjøpsordrer"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr "Ekskluder inaktive innkjøpsordrer fra forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Søk i Salgsordrer"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr "Vis salgsordrer i forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr "Ekskluder Inaktive Salgsordrer"
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr "Ekskluder inaktive salgsordrer fra forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Søk i Returordrer"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr "Vis returordrer i forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr "Ekskluder Inaktive Returordrer"
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr "Ekskluder inaktive returordrer fra forhåndsvisningsvinduet for søk"
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "Forhåndsvisning av søkeresultater"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr "Antall resultater å vise i hver seksjon av søkeresultatsforhåndsvisningen"
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Regex-søk"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr "Aktiver regulære uttrykk i søkeord"
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr "Helordsøk"
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr "Søk returnerer resultater for treff med hele ord"
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Vis antall i skjemaer"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "Vis antall tilgjengelige deler i noen skjemaer"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr "Escape-knappen lukker skjemaer"
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr "Bruk Escape-knappen for å lukke modal-skjemaer"
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Fast navigasjonsbar"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr "Navigasjonsbarens posisjon er fast på toppen av skjermen"
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Datoformat"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Foretrukket format for å vise datoer"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Delplanlegging"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr "Vis delplanleggingsinformasjon"
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr "Lagertelling for Del"
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr "Vis lagertellingsinformasjon for del (om lagertellingsfunksjonalitet er aktivert)"
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr "Tabellstrenglengde"
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr "Maksimal lengdegrense for tekst vist i tabeller"
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr "Standard etikettmal for del"
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr "Etikettmalen for del som velges automatisk"
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr "Standard etikettmal for lagervare"
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr "Etikettmalen for lagervare som velges automatisk"
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr "Standard etikettmal for lagerplassering"
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr "Etikettmalen for lagerplassering som velges automatisk"
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr "Motta feilrapporter"
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr "Motta varsler om systemfeil"
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr "Antall for prisbrudd"
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr "Antall for prisbrudd"
 msgid "Price"
 msgstr "Pris"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr "Enhetspris på spesifisert antall"
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Endepunkt"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr "Endepunktet hvor denne webhooken er mottatt"
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr "Navn for webhooken"
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr "Navn for webhooken"
 msgid "Active"
 msgstr "Aktiv"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr "Er webhooken aktiv"
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Sjetong"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Nøkkel for tilgang"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Hemmelig"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr "Delt hemmlighet for HMAC"
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "Melding ID"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr "Unik Id for denne meldingen"
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Vert"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr "Verten denne meldingen ble mottatt fra"
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Tittel"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "Overskrift for denne meldingen"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Brødtekst"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr "Innholdet i meldingen"
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr "Endepunktet meldingen ble mottatt fra"
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr "Arbeidet med"
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr "Var arbeidet med denne meldingen ferdig?"
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Id"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Tittel"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Publisert"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Forfatter"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Sammendrag"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Les"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr "Er dette nyhetselementet lest?"
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr "Er dette nyhetselementet lest?"
 msgid "Image"
 msgstr "Bilde"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "Bildefil"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr "Enhetsnavn må være en gyldig identifikator"
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr "Enhetsnavn"
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr "Symbol"
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr "Valgfritt enhetssymbol"
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr "Definisjon"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr "Enhetsdefinisjon"
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr "Lenke til adresseinformasjon (ekstern)"
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Basisdel"
@@ -3977,7 +3985,7 @@ msgstr "Velg del"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Velg produsent"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr "Parameterverdi"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr "Den sammenkoblede produsentdelen må referere til samme basisdel"
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "Leverandør"
 msgid "Select supplier"
 msgstr "Velg leverandør"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Leverandørens lagerbeholdningsenhet"
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr "Leverandørens delbeskrivelse"
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Notat"
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Minimum betaling (f.eks. lageravgift)"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr "Slett bilde"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr "Ingen produsentinformasjon tilgjengelig"
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr "Ingen leverandørinformasjon tilgjengelig"
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr "Etikett"
 msgid "Label template file"
 msgstr "Etikett-malfil"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "Høyde [mm]"
 msgid "Label height, specified in mm"
 msgstr "Etiketthøyde, spesifisert i mm"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Filnavnmønster"
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr "Søkefiltre (kommaseparert liste over nøkkel=verdi-par)"
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Filtre"
 
@@ -4846,11 +4854,11 @@ msgstr "Returordre"
 msgid "Total price for this order"
 msgstr "Total pris for denne ordren"
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr "Ordrevaluta"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr "Valuta for denne ordren (la stå tom for å bruke firmastandard)"
 
@@ -5037,7 +5045,7 @@ msgstr "Mottatt"
 msgid "Number of items received"
 msgstr "Antall enheter mottatt"
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr "Sjekket Av"
 msgid "User who checked this shipment"
 msgstr "Brukeren som sjekket forsendelsen"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Forsendelse"
 
@@ -5141,7 +5149,7 @@ msgstr "Kan ikke tildele lagerbeholdning til en linje uten en del"
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "Tildelingsantall kan ikke overstige tilgjengelig lagerbeholdning"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Antall må være 1 for serialisert lagervare"
 
@@ -5215,159 +5223,159 @@ msgstr "Utfall for dette linjeelementet"
 msgid "Cost associated with return or repair for this line item"
 msgstr "Kostnad forbundet med retur eller reparasjon for dette linjeelementet"
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "Ordren kan ikke kanselleres"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr "Tillat ordre å lukkes med ufullstendige linjeelementer"
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr "Ordren har ufullstendige linjeelementer"
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "Ordren er ikke åpen"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Innkjøpsvaluta"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr "Leverandørdel må angis"
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr "Innkjøpsordre må angis"
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr "Leverandør må samsvare med innkjøpsordre"
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr "Innkjøpsordre må samsvare med leverandør"
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr "Ordrelinje"
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr "Linjeelementet samsvarer ikke med innkjøpsordre"
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr "Velg lagerplassering for mottatte enheter"
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr "Angi batchkode for innkommende lagervarer"
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Angi serienummer for innkommende lagervarer"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Strekkode"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr "Skannet strekkode"
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "Strekkode allerede i bruk"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Heltallsverdi må angis for sporbare deler"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr "Linjeelementer må være oppgitt"
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr "Målplassering må angis"
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr "Angitte strekkodeverdier må være unike"
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr "Valuta for salgspris"
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr "Ingen forsendelsesopplysninger oppgitt"
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr "Linjeelement er ikke knyttet til denne ordren"
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr "Mengden må være positiv"
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Skriv inn serienummer for å tildele"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr "Forsendelsen er allerede sendt"
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr "Forsendelsen er ikke knyttet til denne ordren"
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr "Ingen treff funnet for følgende serienummer"
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr "Følgende serienummer er allerede tildelt"
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr "Returordrelinje"
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr "Linjeelementet samsvarer ikke med returordre"
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr "Linjeelementet er allerede mottatt"
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr "Artikler kan bare mottas mot ordrer som pågår"
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr "Valuta for linje"
 
@@ -5771,12 +5779,12 @@ msgstr "Oppdaterte {part} enhetspris to {price}"
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr "Oppdaterte {part} enhetspris til {price} og antall til {qty}"
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "Del-ID"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Delnavn"
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr "IPN"
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Revisjon"
@@ -5869,8 +5877,8 @@ msgstr "Overordnet navn"
 msgid "Category Path"
 msgstr "Sti til kategori"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr "BOM artikkel-ID"
 msgid "Parent IPN"
 msgstr "Overodnet IPN"
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr "Del -IPN"
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr "Minstepris"
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr "Godkjenn hele Stykklisten"
 msgid "This option must be selected"
 msgstr "Dette alternativet må være valgt"
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Standard plassering"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Total lagerbeholdning"
@@ -6008,7 +6016,7 @@ msgstr "Total lagerbeholdning"
 msgid "Input quantity for price calculation"
 msgstr "Sett inn antall for prisberegning"
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Delkategori"
@@ -6090,7 +6098,7 @@ msgstr "Del med dette Navnet, internt delnummer og Revisjon eksisterer allerede.
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr "Deler kan ikke tilordnes strukturelle delkategorier!"
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Delnavn"
 
@@ -6424,604 +6432,610 @@ msgstr "Antall deler dekket av varetellingen"
 msgid "User who requested this stocktake report"
 msgstr "Bruker som forespurte varetellingsrapporten"
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr "Testmaler kan bare bli opprettet for sporbare deler"
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Test with this name already exists for this part"
+msgid "Test template with the same key already exists for part"
 msgstr "Test med dette navnet finnes allerede for denne delen"
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Testnavn"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr "Angi et navn for testen"
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Testbeskrivelse"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr "Legg inn beskrivelse for denne testen"
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Påkrevd"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr "Er det påkrevd at denne testen bestås?"
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Krever verdi"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr "Krever denne testen en verdi når det legges til et testresultat?"
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr "Krever vedlegg"
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr "Krever denne testen et filvedlegg når du legger inn et testresultat?"
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr "Sjekkboksparameter kan ikke ha enheter"
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr "Sjekkboksparameter kan ikke ha valg"
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr "Valg må være unike"
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr "Navn på parametermal må være unikt"
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr "Parameternavn"
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr "Fysisk enheter for denne parameteren"
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr "Parameterbeskrivelse"
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr "Sjekkboks"
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr "Er dette parameteret en sjekkboks?"
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr "Valg"
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr "Gyldige valg for denne parameteren (kommaseparert)"
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr "Ugyldig valg for parameterverdi"
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr "Overordnet del"
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Parametermal"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Data"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Parameterverdi"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Standardverdi"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr "Standard Parameterverdi"
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr "Del-ID eller delnavn"
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr "Unik del-ID-verdi"
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr "Delens interne delnummerverdi"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr "Nivå"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr "BOM-nivå"
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr "Velg overordnet del"
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr "Underordnet del"
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr "Velg del som skal brukes i BOM"
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr "BOM-antall for denne BOM-artikkelen"
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr "Denne BOM-artikkelen er valgfri"
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr "Denne BOM-artikkelen er forbruksvare (den spores ikke i produksjonsordrer)"
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr "Svinn"
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Forventet produksjonssvinn (absolutt eller prosent)"
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr "BOM-artikkelreferanse"
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr "BOM-artikkelnotater"
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr "Kontrollsum"
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr "BOM-linje kontrollsum"
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "Godkjent"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr "Denne BOM-artikkelen er godkjent"
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr "Arves"
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr "Denne BOM-artikkelen er arvet fra stykkliste for variantdeler"
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Tillat Varianter"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr "Lagervarer for variantdeler kan brukes for denne BOM-artikkelen"
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr "Antall må være heltallsverdi for sporbare deler"
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr "Underordnet del må angis"
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr "BOM-artikkel erstatning"
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr "Erstatningsdel kan ikke være samme som hoveddelen"
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr "Overordnet BOM-artikkel"
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr "Erstatningsdel"
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr "Del 1"
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr "Del 2"
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr "Velg relatert del"
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr "Del-forhold kan ikke opprettes mellom en del og seg selv"
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr "Duplikatforhold eksisterer allerede"
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Underkategorier"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Innkjøpsvaluta for lagervaren"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr "Ingen deler valgt"
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr "Velg kategori"
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr "Original Del"
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr "Velg original del å duplisere"
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Kopier Bilde"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr "Kopier bilde fra originaldel"
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr "Kopier Stykkliste"
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr "Kopier stykkliste fra original del"
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Kopier parametere"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr "Kopier parameterdata fra originaldel"
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr "Kopier notater"
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr "Kopier notater fra originaldel"
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr "Innledende lagerbeholdning"
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr "Angi initiell lagermengde for denne delen. Hvis antall er null, er ingen lagerbeholdning lagt til."
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr "Innledende lagerplassering"
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr "Angi initiell lagerplasering for denne delen"
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr "Velg leverandør (eller la stå tom for å hoppe over)"
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr "Velg produsent (eller la stå tom for å hoppe over)"
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr "Produsentens delenummer"
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr "Valgt firma er ikke en gyldig leverandør"
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr "Valgt firma er ikke en gyldig produsent"
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr "Produsentdel som matcher dette MPN-et, finnes allerede"
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr "Leverandørdel som matcher denne SKU-en, finnes allerede"
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "Exclude External Stock"
 msgid "External Stock"
 msgstr "Ekskluder ekstern lagerbeholdning"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Allocated Stock"
 msgid "Unallocated Stock"
 msgstr "Tildelt lagerbeholdning"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 #, fuzzy
 #| msgid "Part Stock"
 msgid "Variant Stock"
 msgstr "Dellager"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "Dupliser del"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr "Kopier innledende data fra en annen del"
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr "Innledende lagerbeholdning"
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr "Lag en del med innledende lagermengde"
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr "Leverandøropplysninger"
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr "Legg til innledende leverandørinformasjon for denne delen"
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr "Kopier kategoriparametre"
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr "Kopier parametermaler fra valgt delkategori"
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr "Eksisterende bilde"
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr "Filnavn for et eksisterende del-bilde"
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr "Bildefilen finnes ikke"
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr "Begrens lagerbeholdningsrapport til en bestemt del og enhver variant av delen"
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr "Begrens lagerbeholdningsrapport til en bestemt delkategori og alle underkategorier"
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr "Begrens lagerbeholdningsrapport til en bestemt plasering og eventuelle underplasseringer"
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr "Ekskluder ekstern lagerbeholdning"
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr "Ekskluder lagervarer i eksterne lokasjoner"
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Generer rapport"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr "Genererer rapport som inneholder beregnede lagerdata"
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr "Oppdater deler"
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr "Oppdater spesifiserte deler med beregnede lagerbeholdningsdata"
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr "Lagerbeholdningsfunksjonalitet er ikke aktivert"
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr "Overstyr beregnet verdi for minimumspris"
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr "Valuta for minstepris"
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr "Overstyr beregnet verdi for maksimal pris"
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr "Valuta for maksimal pris"
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr "Oppdater"
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr "Oppdater priser for denne delen"
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr "Kan ikke konvertere fra gitte valutaer til {default_currency}"
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr "Minsteprisen kan ikke være større enn maksimal pris"
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr "Maksimal pris kan ikke være mindre enn minstepris"
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr "Velg del å kopiere BOM fra"
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr "Fjern eksisterende data"
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr "Fjern eksisterende BOM-artikler før kopiering"
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr "Inkluder arvede"
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr "Inkluder BOM-artikler som er arvet fra maldeler"
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr "Hopp over ugyldige rader"
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr "Aktiver dette alternativet for å hoppe over ugyldige rader"
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr "Kopier erstatningsdeler"
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr "Kopier erstatningsdeler når BOM-elementer dupliseres"
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr "Nullstill eksisterende BOM"
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr "Fjern eksisterende BOM-artikler før opplastning"
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr "Ingen del-kolonne angitt"
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr "Flere samsvarende deler funnet"
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr "Ingen samsvarende del funnet"
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr "Delen er ikke betegnet som en komponent"
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr "Antall ikke oppgitt"
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Ugyldig antall"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr "Minst en BOM-artikkel kreves"
 
@@ -8031,7 +8045,7 @@ msgstr "Kantlinjer"
 msgid "Print a border around each label"
 msgstr "Skriv ut en kant rundt hver etikett"
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr "Liggende"
 
@@ -8339,16 +8353,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "Ingen gyldige objekter angitt for mal"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr "Malfil '{template}' mangler eller eksisterer ikke"
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr "Testrapport"
 
@@ -8368,103 +8382,115 @@ msgstr "Legal"
 msgid "Letter"
 msgstr "Letter"
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Malnavn"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "Rapportmalfil"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr "Beskrivelse av rapportmal"
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr "Rapportrevisjonsnummer (øker automatisk)"
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr "Sidestørrelse for PDF-rapporter"
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr "Generer rapport i landskapsorientering"
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr "Mønster for å generere rapportfilnavn"
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr "Rapportmal er aktiver"
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr "Lagervare-søkefilter (kommaseparert liste over nøkkel=verdi-par)"
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr "Inkluder installerte tester"
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr "Inkluder testresultater for lagervarer installert i sammenstilt artikkel"
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr "Produksjonsfiltre"
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr "Produksjons-søkefilter (kommaseparert liste over nøkkel=verdi-par"
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Delfiltre"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr "Del-søkefilter (kommaseparert liste over nøkkel=verdi-par"
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr "Innkjøpsordre-søkefilter"
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr "Salgsordre-søkefilter"
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr "Returordre-søkefilter"
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Stock item with this serial number already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Lagervare med dette serienummeret eksisterer allerede"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Snutt"
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr "Rapportsnuttfil"
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr "Filbeskrivelse for snutt"
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Vedlegg med dette filnavnet finnes allerede"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr "Ressurs"
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr "Rapportressursfil"
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr "Ressursfilbeskrivelse"
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr "spørringsfiltre for lagerplassering (kommadelt liste av nøkkel=verdi-par)"
 
@@ -8771,7 +8797,7 @@ msgstr "De kan ikke gjøre denne plasseringen strukturell, da noen lagervarer al
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr "Lagervarer kan ikke plasseres i strukturelle plasseringer!"
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr "Lagervare kan ikke opprettes for virtuelle deler"
 
@@ -8816,7 +8842,7 @@ msgstr "Velg en tilsvarende leverandørdel for denne lagervaren"
 msgid "Where is this stock item located?"
 msgstr "Hvor er denne lagervaren plassert?"
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr "Inpakningen denne lagervaren er lagret i"
 
@@ -8828,7 +8854,7 @@ msgstr "Er denne artikkelen montert i en annen artikkel?"
 msgid "Serial number for this item"
 msgstr "Serienummer for denne artikkelen"
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr "Batchkode for denne lagervaren"
 
@@ -8905,7 +8931,7 @@ msgstr "Serienumre må være en liste over tall"
 msgid "Quantity does not match serial numbers"
 msgstr "Antallet stemmer ikke overens med serienumrene"
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Seriernummer eksisterer allerede"
 
@@ -8937,7 +8963,7 @@ msgstr "Lagervare er for tiden i produksjon"
 msgid "Serialized stock cannot be merged"
 msgstr "Serialisert lagerbeholdning kan ikke slås sammen"
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr "Duplisert lagervare"
 
@@ -8985,184 +9011,184 @@ msgstr "Vedlegg til testresultat"
 msgid "Test notes"
 msgstr "Testnotater"
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr "Serienummeret er for høyt"
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr "Bruk pakningsstørrelse når du legger til: antall definert er antall pakker"
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr "Innkjøpspris for denne lagervaren, per enhet eller forpakning"
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr "Angi antall lagervarer som skal serialiseres"
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr "Antall kan ikke overstige tilgjengelig lagerbeholdning ({q})"
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "Angi serienummer for nye artikler"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr "Til Lagerplassering"
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr "Valgfritt notatfelt"
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr "Serienummer kan ikke tilordnes denne delen"
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr "Velg lagervare å montere"
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr "Antall å installere"
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr "Angi antallet elementer som skal installeres"
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr "Legg til transaksjonsnotat (valgfritt)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr "Antall å installere må være minst 1"
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr "Lagervaren er utilgjengelig"
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr "Valgt del er ikke i stykklisten"
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr "Antall å installere må ikke overskride tilgjengelig antall"
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr "Lagerplassering for den avinstallerte artikkelen"
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr "Velg del å konvertere lagervare til"
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr "Valgt del er ikke et gyldig alternativ for konvertering"
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr "Kan ikke konvertere lagerprodukt med tildelt leverandørdel"
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr "Lagerplassering for returnert artikkel"
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr "Velg lagervarer for å endre status"
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr "Ingen lagervarer valgt"
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Underplasseringer"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr "Delen må være salgbar"
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr "Artikkelen er tildelt en salgsordre"
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr "Artikkelen er tildelt en produksjonsordre"
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr "Kunde å tilordne lagervarer"
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr "Valgt firma er ikke en kunde"
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr "Lagervare-tildelignsnotater"
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr "En liste av lagervarer må oppgis"
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr "Notater om lagersammenslåing"
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr "Tillat forskjellige leverandører"
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr "Tillat lagervarer med forskjellige leverandørdeler å slås sammen"
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr "Tillat forskjellig status"
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr "Tillat lagervarer med forskjellige statuskoder å slås sammen"
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr "Minst to lagervarer må oppgis"
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr "Lagervare primærnøkkel verdi"
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr "Lagervare statuskode"
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr "Lager transaksjonsnotater"
 
diff --git a/InvenTree/locale/pl/LC_MESSAGES/django.po b/InvenTree/locale/pl/LC_MESSAGES/django.po
index 2717fa3ce100..da598159cefc 100644
--- a/InvenTree/locale/pl/LC_MESSAGES/django.po
+++ b/InvenTree/locale/pl/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-03-06 10:36\n"
 "Last-Translator: \n"
 "Language-Team: Polish\n"
@@ -30,20 +30,20 @@ msgstr "Użytkownik nie ma uprawnień do przeglądania tego modelu"
 msgid "Invalid unit provided ({unit})"
 msgstr "Nieprawidłowa jednostka ({unit})"
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Nie podano wartości"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Nie udało się przeliczyć {original} na {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Podano nieprawidłową ilość"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Niepoprawna ilość ({exc})"
@@ -65,9 +65,9 @@ msgstr "Wprowadź dane"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Podany e-mail domeny nie został zatwierdzony."
 msgid "Registration is disabled."
 msgstr "Rejestracja jest wyłączona."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Podano nieprawidłową ilość"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Pusty ciąg numeru seryjnego"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Podwójny numer seryjny"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Nieprawidłowy zakres grupy: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Zakres grupy {group} przekracza dozwoloną ilość ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Nieprawidłowa kolejność grup: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Nie znaleziono numerów seryjnych"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Liczba unikalnych numerów seryjnych ({len(serials)}) musi odpowiadać ilości ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Usuń znaczniki HTML z tej wartości"
 
@@ -401,7 +401,7 @@ msgstr "Załącznik"
 msgid "Select file to attach"
 msgstr "Wybierz plik do załączenia"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Komentarz"
 msgid "File comment"
 msgstr "Komentarz pliku"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Duplikaty nazw nie mogą istnieć pod tym samym rodzicem"
 msgid "Invalid choice"
 msgstr "Błędny wybór"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Nazwa"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Błąd serwera"
 msgid "An error has been logged by the server."
 msgstr "Błąd został zapisany w logach serwera."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Numer musi być prawidłowy"
 
@@ -678,7 +678,7 @@ msgstr "Adres URL zdalnego pliku obrazu"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Pobieranie obrazów ze zdalnego URL nie jest włączone"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Sprawdzenie robotnika w tle nie powiodło się"
 
@@ -938,14 +938,14 @@ msgstr "O InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Kompilacja musi zostać anulowana, zanim będzie mogła zostać usunięta"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Materiał eksploatacyjny"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Odwołanie do zamówienia wykonania"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Zamówienie budowy, do którego budowa jest przypisana"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Zamówienie budowy, do którego budowa jest przypisana"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Status budowania"
 msgid "Build status code"
 msgstr "Kod statusu budowania"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Kod partii"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Skompilowane dane wyjściowe nie pasują do kolejności kompilacji"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Ilość musi być większa niż zero"
 
@@ -1285,10 +1285,10 @@ msgstr "Zbuduj obiekt"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Zbuduj obiekt"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Numer seryjny"
@@ -1451,10 +1451,10 @@ msgstr "Poniższe numery seryjne już istnieją lub są nieprawidłowe"
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Akceptuj niekompletne"
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "Towar musi znajdować się w magazynie"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr "Przedmiot opcjonalny"
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Element BOM"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr "W Zamówieniu"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr "W produkcji"
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr "Opis projektu"
 msgid "User or group responsible for this project"
 msgstr "Użytkownik lub grupa odpowiedzialna za to zamówienie"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Klucz ustawień (musi być unikalny - niewrażliwy na wielkość liter)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Ustawienia wartości"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "Wybrana wartość nie jest poprawną opcją"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "Wartość musi być wartością binarną"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "Wartość musi być liczbą całkowitą"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "Ciąg musi być unikatowy"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Brak grupy"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Pusta domena nie jest dozwolona."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Niepoprawna nazwa domeny: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Brak wtyczki"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Wymagane ponowne uruchomienie"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "Zmieniono ustawienie, które wymaga restartu serwera"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Oczekujące migracje"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr "Liczba oczekujących migracji bazy danych"
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Nazwa instancji serwera"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Użyj nazwy instancji"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Nazwa firmy"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Wewnętrzna nazwa firmy"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "Bazowy URL"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "Bazowy adres URL dla instancji serwera"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Domyślna waluta"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr "Interwał aktualizacji waluty"
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr "Jak często aktualizować kursy wymiany walut (ustaw zero aby wyłączyć)"
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "dni"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr "Wtyczka aktualizacji waluty"
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Pobierz z adresu URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Zezwól na pobieranie zewnętrznych obrazów i plików z zewnętrznego URL"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Limit rozmiaru pobierania"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr "Ścisła weryfikacja adresu URL"
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr "Wymagaj specyfikacji schematu podczas sprawdzania poprawności adresów URL"
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Wymagaj potwierdzenia"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Wymagaj wyraźnego potwierdzenia dla określonych działań."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Głębokość drzewa"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Domyślna głębokość drzewa dla widoku drzewa. Głębsze poziomy mogą być leniwe, gdy są potrzebne."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Częstotliwość sprawdzania aktualizacji"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Jak często aktualizować kursy wymiany walut (ustaw zero aby wyłączyć)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Automatyczna kopia zapasowa"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Włącz automatyczną kopię zapasową bazy danych i plików multimedialnych"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Interwał automatycznego tworzenia kopii zapasowych"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Określ liczbę dni między zdarzeniami automatycznej kopii zapasowej"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Interwał usuwania zadań"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Obsługa kodu kreskowego"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "Wyrażenie regularne IPN"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Zezwól na powtarzający się IPN"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Zezwól na edycję IPN"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Skopiuj BOM komponentu"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Szablon"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Złożenie"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Komponent"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Możliwość zakupu"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Części są domyślnie z możliwością zakupu"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Możliwość sprzedaży"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Części są domyślnie z możliwością sprzedaży"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Możliwość śledzenia"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Części są domyślnie z możliwością śledzenia"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Wirtualny"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Części są domyślnie wirtualne"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Ceny wewnętrzne"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Włącz drukowanie etykiet"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Włącz drukowanie etykiet z interfejsu WWW"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "DPI etykiety"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Włącz raporty"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Tryb Debugowania"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Rozmiar strony"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Domyślna wielkość strony dla raportów PDF"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Włącz generowanie raportów testów"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr "Automatycznie wypełniaj zlecenia zakupu"
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr "Automatycznie oznacz zlecenia jako zakończone po odebraniu wszystkich pozycji"
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Włącz opcję zapomnianego hasła"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Włącz funkcję zapomnianego hasła na stronach logowania"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Włącz rejestrację"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Włącz samodzielną rejestrację dla użytkowników na stronach logowania"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "Włącz SSO"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "Włącz SSO na stronach logowania"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Adres e-mail jest wymagany"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "Autouzupełnianie użytkowników SSO"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Automatycznie wypełnij dane użytkownika z danych konta SSO"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "E-mail dwa razy"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "Przy rejestracji dwukrotnie zapytaj użytkowników o ich adres e-mail"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Hasło dwukrotnie"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "Przy rejestracji dwukrotnie zapytaj użytkowników o ich hasło"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Grupuj przy rejestracji"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Wymuś MFA"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Użytkownicy muszą używać zabezpieczeń wieloskładnikowych."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Sprawdź wtyczki przy starcie"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "Włącz integrację URL"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "Włącz wtyczki, aby dodać ścieżki URL"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "Włącz integrację z aplikacją"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "Włącz wtyczki, aby dodać aplikacje"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Włącz wtyczki, aby uruchamiać zaplanowane zadania"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Klucz ustawień (musi być unikalny - niewrażliwy na wielkość liter"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Pokaż obserwowane części"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Pokaż obserwowane części na stronie głównej"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Pokaż obserwowane kategorie"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Pokaż obserwowane kategorie części na stronie głównej"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Pokaż najnowsze części"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Pokaż najnowsze części na stronie głównej"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Pokaż niski stan magazynowy"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Pokaż elementy o niskim stanie na stronie głównej"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Pokaż wymagany stan zapasów"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Szukaj części"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Ukryj nieaktywne części"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Wyszukaj zlecenia zakupu"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Wyklucz nieaktywne zlecenia zakupu"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Pokaż ilość w formularzach"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Stały pasek nawigacyjny"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Format daty"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Preferowany format wyświetlania dat"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Planowanie komponentów"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr "Cena"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Punkt końcowy"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr "Aktywny"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Sekret"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr "Współdzielony sekret dla HMAC"
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "Id wiadomości"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr "Unikalny identyfikator dla tej wiadomości"
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr "Host, od którego otrzymano tę wiadomość"
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Nagłówek"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "Nagłówek tej wiadomości"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Zawartość"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Autor"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr "Obraz"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Część bazowa"
@@ -3977,7 +3985,7 @@ msgstr "Wybierz część"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Wybierz producenta"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "Dostawca"
 msgid "Select supplier"
 msgstr "Wybierz dostawcę"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Uwaga"
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr "Etykieta"
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "Wysokość [mm]"
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Wzór nazwy pliku"
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Filtry"
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr "Odebrane"
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr "Sprawdzone przez"
 msgid "User who checked this shipment"
 msgstr "Użytkownik, który sprawdził tę wysyłkę"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Przesyłka"
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "Zarezerwowana ilość nie może przekraczać ilości na stanie"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "Zamówienie nie może zostać anulowane"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr "Zlecenie zakupu musi być określone"
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr "Dostawca musi być zgodny ze zleceniem zakupu"
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr "Zlecenie zakupu musi być zgodne z dostawcą"
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr "Pozycja nie pasuje do zlecenia zakupu"
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Kod kreskowy"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "ID komponentu"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Nazwa komponentu"
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Wersja"
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr "Ścieżka kategorii"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr "IPN komponentu"
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr "Ta opcja musi być zaznaczona"
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Domyślna lokalizacja"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Kategoria komponentu"
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Nazwa komponentu"
 
@@ -6424,598 +6432,604 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Załącznik o tej nazwie już istnieje"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Nazwa testu"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Testowy opis"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr "Wprowadź opis do tego testu"
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Wymagane"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Wymaga wartości"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr "Wymaga załącznika"
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr "Część nadrzędna"
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Dane"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Wartość parametru"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Wartość domyślna"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr "Unikalny wartość ID komponentu"
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr "Wartość IPN części"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr "Poziom"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr "Wybierz część nadrzędną"
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr "Podczęść"
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr "Ten element BOM jest opcjonalny"
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr "Notatki pozycji BOM"
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr "Suma kontrolna"
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "Zatwierdzone"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Zezwalaj na warianty"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr "Część zastępcza"
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr "Część 1"
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr "Część 2"
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr "Wybierz powiązaną część"
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Podkategorie"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Waluta zakupu tego towaru"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Kopiuj obraz"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr "Kopiuj BOM"
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Kopiuj parametry"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "Duplikuj część"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr "Usuń istniejące dane"
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr "Pomiń nieprawidłowe wiersze"
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr "Włącz tę opcję, aby pominąć nieprawidłowe wiersze"
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr "Wyczyść istniejący BOM"
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr "Nie podano ilości"
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Nieprawidłowa ilość"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8039,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8347,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "Brak prawidłowych obiektów do szablonu"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr "Plik szablonu '{template}' jest brakujący lub nie istnieje"
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr "Raporty z testów"
 
@@ -8362,103 +8376,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Nazwa szablonu"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "Plik szablonu raportu"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr "Opis szablonu raportu"
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr "Numer zmiany raportu (przyrasta automatycznie)"
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr "Domyślna wielkość strony dla raportów PDF"
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr "Renderuj raport w orientacji poziomej"
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr "Wzorzec generowania nazw plików raportu"
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr "Szablon raportu jest włączony"
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Filtr części"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr "Filtry zapytania zleceń zakupu"
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Załącznik o tej nazwie już istnieje"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Wycinek"
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Załącznik o tej nazwie już istnieje"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8791,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8836,7 @@ msgstr "Wybierz pasującą część dostawcy dla tego towaru"
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8822,7 +8848,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8899,7 +8925,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Numer seryjny już istnieje"
 
@@ -8931,7 +8957,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8979,184 +9005,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Podlokalizacje"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr "Część musi być dostępna do sprzedaży"
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/pt/LC_MESSAGES/django.po b/InvenTree/locale/pt/LC_MESSAGES/django.po
index 64791dc6ae45..87463ed786bb 100644
--- a/InvenTree/locale/pt/LC_MESSAGES/django.po
+++ b/InvenTree/locale/pt/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Portuguese, Brazilian\n"
@@ -30,20 +30,20 @@ msgstr "Usuário não tem permissão para ver este modelo"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Nenhum valor fornecido"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Não foi possível converter {original} para {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Quantidade fornecida inválida"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Quantidade fornecida inválida ({exc})"
@@ -65,9 +65,9 @@ msgstr "Insira uma Data"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "O domínio de e-mail providenciado não foi aprovado."
 msgid "Registration is disabled."
 msgstr "Cadastro está desativado."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Quantidade fornecida inválida"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Número serial em branco"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Número de série duplicado"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Intervalo de grupo inválido: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Intervalo do grupo {group} excede a quantidade permitida ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Sequência de grupo inválida:{group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Nenhum número de série foi encontrado"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Números de série únicos ({len(serials)}) deve corresponder a quantidade ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Remova as \"tags\" HTML deste valor"
 
@@ -401,7 +401,7 @@ msgstr "Anexo"
 msgid "Select file to attach"
 msgstr "Selecione arquivo para anexar"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Comentario"
 msgid "File comment"
 msgstr "Comentario sobre arquivo"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Nomes duplicados não podem existir sob o mesmo parental"
 msgid "Invalid choice"
 msgstr "Escolha inválida"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Nome"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Erro de servidor"
 msgid "An error has been logged by the server."
 msgstr "Log de erro salvo pelo servidor."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Preicsa ser um numero valido"
 
@@ -678,7 +678,7 @@ msgstr "URL do arquivo de imagem remoto"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Baixar imagens de URL remota não está habilitado"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Falha em verificar o histórico do trabalhador"
 
@@ -938,14 +938,14 @@ msgstr "Sobre o InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Produção deve ser cancelada antes de ser deletada"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Consumível"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Referência do pedido de produção"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Pedido de produção para qual este serviço está alocado"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Pedido de produção para qual este serviço está alocado"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Progresso da produção"
 msgid "Build status code"
 msgstr "Código de situação da produção"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Código de Lote"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Saída da produção não corresponde ao Pedido de Produção"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Quantidade deve ser maior que zero"
 
@@ -1285,10 +1285,10 @@ msgstr "Objeto de produção"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Objeto de produção"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Quantidade deve ser 1 para estoque serializado"
 msgid "Selected stock item does not match BOM line"
 msgstr "Item estoque selecionado não coincide com linha da LDM"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Quantidade inteira necessária para peças rastreáveis"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Quantidade inteira necessária, pois a lista de materiais contém peças rastreáveis"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Números de Série"
@@ -1451,10 +1451,10 @@ msgstr "Os seguintes números de série já existem ou são inválidos"
 msgid "A list of build outputs must be provided"
 msgstr "Uma lista de saídas de produção deve ser fornecida"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Local para saídas de produção concluídas"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Aceitar que os itens de estoque não foram totalmente alocados para esta
 msgid "Required stock has not been fully allocated"
 msgstr "Estoque obrigatório não foi totalmente alocado"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Aceitar Incompleto"
 
@@ -1602,11 +1602,11 @@ msgstr "Item da linha de produção"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bin_item.part deve indicar a mesma peça do pedido de produção"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "Item deve estar em estoque"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Quantidade disponível ({q}) excedida"
@@ -1619,7 +1619,7 @@ msgstr "Saída de produção deve ser definida para alocação de peças rastrea
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "Saída de produção deve ser definida para alocação de peças não rastreadas"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Alocação do Item precisa ser fornecida"
 
@@ -1659,7 +1659,7 @@ msgstr "Itens opcionais"
 msgid "Allocate optional BOM items to build order"
 msgstr "Alocar itens LDM opcionais para o pedido de produção"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Item LDM"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr "Estoque Alocado"
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr "Estoque Alocado"
 msgid "On Order"
 msgstr "No pedido"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr "Em Produção"
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr "Descrição do projeto"
 msgid "User or group responsible for this project"
 msgstr "Usuário ou grupo responsável por este projeto"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Senha de configurações (deve ser única — diferencia maiúsculas de minúsculas)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Valor da Configuração"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "Valor escolhido não é uma opção válida"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "Valor deve ser um valor booleano"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "Valor deve ser um número inteiro"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "A frase senha deve ser diferenciada"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Nenhum grupo"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Um domínio vazio não é permitido."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Nome de domínio inválido: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Sem extensão"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Reinicialização necessária"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "Uma configuração que requer uma reinicialização do servidor foi alterada"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Migrações pendentes"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr "Número de migrações pendentes na base de dados"
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Nome da Instância do Servidor"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "Descritor de frases para a instância do servidor"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Usar nome da instância"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Usar o nome da instância na barra de título"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Restringir a exibição 'sobre'"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Mostrar 'sobre' modal apenas para superusuários"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Nome da empresa"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Nome interno da Empresa"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "URL de Base"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "URL Base da instância do servidor"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Moeda Padrão"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr "Selecione a moeda base para cálculos de preços"
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr "Intervalo de Atualização da Moeda"
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr "Com que frequência atualizar as taxas de câmbio (defina como zero para desativar)"
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "dias"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr "Extensão de Atualização de Moeda"
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr "Extensão de Atualização de Moeda a utilizar"
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Baixar do URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Permitir baixar imagens remotas e arquivos de URLs externos"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Limite de tamanho para baixar"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Maior tamanho de imagem remota baixada permitida"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "Usuário-agente utilizado para baixar da URL"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "Permitir a substituição de imagens e arquivos usados baixados por usuário-agente (deixar em branco por padrão)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr "Validação rigorosa de URL"
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr "Exigir especificação de esquema ao validar URLs"
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Exigir confirmação"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Exigir confirmação explícita do usuário para uma certa ação."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Profundidade da árvore"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Profundidade padrão de visualização da árvore. Níveis mais profundos podem ser carregados gradualmente conforme necessário."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Atualizar Intervalo de Verificação"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Frequência para verificar atualizações (defina como zero para desativar)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Cópia de Segurança Automática"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Ativar cópia de segurança automática do banco de dados e arquivos de mídia"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Intervalo de Backup Automático"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Especificar o número de dia entre as cópias de segurança"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Intervalo para Excluir da Tarefa"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "Os resultados da tarefa no plano de fundo serão excluídos após um número especificado de dias"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr "Intervalo para Excluir do Registro de Erro"
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "Registros de erros serão excluídos após um número especificado de dias"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr "Intervalo para Excluir de Notificação"
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Notificações de usuários será excluído após um número especificado de dias"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Suporte aos códigos de barras"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr "Ativar suporte a leitor de código de barras na interface web"
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Atraso na entrada de código de barras"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Tempo de atraso de processamento de entrada de barras"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Suporte a código de barras via Câmera"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Permitir escanear código de barras por câmera pelo navegador"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr "Revisões de peças"
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr "Habilitar campo de revisão para a Peça"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "Regex IPN"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Padrão de expressão regular adequado para Peça IPN"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Permitir Duplicação IPN"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Permitir que várias peças compartilhem o mesmo IPN"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Permitir Edição IPN"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Permitir trocar o valor do IPN enquanto se edita a peça"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Copiar dados da LDM da Peça"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Copiar dados da LDM por padrão quando duplicar a peça"
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Copiar Dados de Parâmetro da Peça"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Copiar dados de parâmetros por padrão quando duplicar uma peça"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Copiar Dados Teste da Peça"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Copiar dados de teste por padrão quando duplicar a peça"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Copiar Parâmetros dos Modelos de Categoria"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Copiar parâmetros do modelo de categoria quando criar uma peça"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Modelo"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Peças são modelos por padrão"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Montagem"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Peças podem ser montadas a partir de outros componentes por padrão"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Componente"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Peças podem ser usadas como sub-componentes por padrão"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Comprável"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Peças são compráveis por padrão"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Vendível"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Peças vão vendíveis por padrão"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Rastreável"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Peças vão rastreáveis por padrão"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Virtual"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Peças são virtuais por padrão"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Mostrar Importações em Visualizações"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Exibir o assistente de importação em algumas visualizações de partes"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Mostra peças relacionadas"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Mostrar peças relacionadas para uma peça"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Dados Iniciais de Estoque"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Permitir Criação de estoque inicial quando adicional uma nova peça"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Dados Iniciais de Fornecedor"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Permitir criação de dados iniciais de fornecedor quando adicionar uma nova peça"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Formato de Exibição do Nome da Peça"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Formato para exibir o nome da peça"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Ícone de Categoria de Peça Padrão"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Ícone padrão de categoria de peça (vazio significa sem ícone)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr "Forçar Unidades de Parâmetro"
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr "Se as unidades são fornecidas, os valores do parâmetro devem corresponder às unidades especificadas"
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr "Mínimo de Casas Decimais do Preço"
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr "Mínimo número de casas decimais a exibir quando renderizar dados de preços"
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr "Máximo Casas Decimais de Preço"
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr "Número máximo de casas decimais a exibir quando renderizar dados de preços"
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Usar Preços do Fornecedor"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr "Incluir quebras de preço do fornecedor nos cálculos de preços globais"
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Sobrescrever histórico de compra"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr "Histórico do pedido de compra substitui os intervalos dos preços do fornecedor"
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Usar Preços do Item em Estoque"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "Usar preço inserido manualmente no estoque para cálculos de valores"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Idade do preço do Item em Estoque"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Não incluir itens em estoque mais velhos que este número de dias no cálculo de preços"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr "Usar Preço Variável"
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr "Incluir preços variáveis nos cálculos de valores gerais"
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Apenas Ativar Variáveis"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr "Apenas usar peças variáveis ativas para calcular preço variáveis"
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr "Intervalo de Reconstrução de Preços"
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr "Número de dias antes da atualização automática dos preços das peças"
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Preços Internos"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "Habilitar preços internos para peças"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Sobrepor Valor Interno"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr "Se disponível, preços internos sobrepõe variação de cálculos de preço"
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Ativar impressão de etiquetas"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Ativar impressão de etiqueta pela interface da internet"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "DPI da Imagem na Etiqueta"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr "Resolução de DPI quando gerar arquivo de imagens para fornecer à extensão de impressão de etiquetas"
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Habilitar Relatórios"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Ativar geração de relatórios"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Modo de depuração"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Gerar relatórios em modo de depuração (saída HTML)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Tamanho da página"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Tamanho padrão da página PDF para relatórios"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Ativar Relatórios Teste"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Ativar geração de relatórios de teste"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Anexar Relatórios de Teste"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Quando imprimir um Relatório de Teste, anexar uma cópia do mesmo ao item de estoque associado"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr "Seriais Únicos Globais"
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "Números de série para itens de estoque devem ser globalmente únicos"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Preenchimento automático de Números Seriais"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Preencher números de série automaticamente no formulário"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Excluir Estoque Esgotado"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Determina o comportamento padrão quando um item de estoque é esgotado"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr "Modelo de Código de Lote"
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Modelo para gerar códigos de lote padrão para itens de estoque"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Validade do Estoque"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "Ativar função de validade de estoque"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "Vender estoque expirado"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "Permitir venda de estoque expirado"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Tempo de Estoque Inativo"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Número de dias em que os itens em estoque são considerados obsoleto antes de vencer"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Produzir Estoque Vencido"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Permitir produção com estoque vencido"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "Controle de propriedade do estoque"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Ativar controle de propriedade sobre locais e itens de estoque"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr "Ícone padrão do local de estoque"
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr "Ícone padrão de local de estoque (vazio significa sem ícone)"
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr "Mostrar Itens de Estoque Instalados"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr "Exibir itens de estoque instalados nas tabelas de estoque"
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Modelo de Referência de Pedidos de Produção"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Modelo necessário para gerar campo de referência do Pedido de Produção"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr "Ativar Pedidos de Devolução"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr "Ativar funcionalidade de pedido de retorno na interface do usuário"
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr "Modelo de Referência de Pedidos de Devolução"
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr "Modelo necessário para gerar campo de referência do Pedido de Devolução"
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr "Editar os Pedidos de Devolução Concluídos"
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr "Permitir a edição de pedidos de devolução após serem enviados ou concluídos"
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr "Modelo de Referência de Pedidos de Venda"
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr "Modelo necessário para gerar campo de referência do Pedido de Venda"
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr "Envio Padrão de Pedidos de Venda"
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr "Habilitar criação de envio padrão com Pedidos de Vendas"
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr "Editar os Pedidos de Vendas concluídos"
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr "Permitir a edição de pedidos de vendas após serem enviados ou concluídos"
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr "Modelo de Referência de Pedidos de Compras"
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr "Modelo necessário para gerar campo de referência do Pedido de Compra"
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Editar Pedidos de Compra Concluídos"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr "Permitir a edição de pedidos de compras após serem enviados ou concluídos"
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr "Autocompletar Pedidos de Compra"
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr "Marcar automaticamente os pedidos de compra como concluídos quando todos os itens de linha forem recebidos"
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Habitar esquecer senha"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Habilitar a função \"Esqueci minha senha\" nas páginas de acesso"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Habilitar cadastro"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Ativar auto-registro para usuários na página de entrada"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "Ativar SSO"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "Ativar SSO na página de acesso"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "Ativar registro SSO"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr "Ativar auto-registro por SSO para usuários na página de entrada"
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Email obrigatório"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr "Exigir do usuário o e-mail no cadastro"
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "Auto-preencher usuários SSO"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Preencher automaticamente os detalhes do usuário a partir de dados da conta SSO"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "Enviar email duplo"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "No registro pedir aos usuários duas vezes pelo email"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Senha duas vezes"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "No registro pedir aos usuários duas vezes pela senha"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Domínios permitidos"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr "Restringir registros a certos domínios (separados por vírgula, começando com @)"
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Grupo no cadastro"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr "Grupo ao qual novos usuários são atribuídos no registro"
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Forçar AMF"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Os usuários devem usar uma segurança multifator."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Checar extensões no início"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr "Checar que todas as extensões instaladas no início — ativar em ambientes de contêineres"
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr "Verificar por atualizações de plugin"
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr "Habilitar verificações periódicas de atualizações para plugins instalados"
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "Ativar integração URL"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "Ativar extensão para adicionar rotas URL"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr "Ativar integração de navegação"
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr "Ativar extensões para integrar à navegação"
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "Ativa integração com aplicativo"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "Ativar extensões para adicionar aplicativos"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr "Ativar integração do calendário"
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Ativar extensões para executar tarefas agendadas"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr "Ativar integração de eventos"
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr "Ativar extensões para responder a eventos internos"
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr "Habilitar códigos de projeto"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr "Ativar códigos de projeto para rastrear projetos"
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr "Funcionalidade de Balanço do Inventário"
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr "Ativar funcionalidade de balanço para gravar níveis de estoque e calcular seu valor"
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr "Excluir Locais Externos"
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr "Excluir itens de estoque em locais externos dos cálculos do estoque"
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr "Período de Balanço Automático"
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr "Número de dias entre gravação do balanço de estoque (coloque zero para desativar)"
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr "Intervalo para Excluir o Relatório"
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr "Relatórios de balanço serão apagados após um número de dias especificado"
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr "Mostrar nomes completos dos usuários"
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr "Mostrar Nomes Completos em vez de Nomes de Usuário"
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Senha de configurações (deve ser única — diferencia maiúsculas de minúsculas"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr "Ocultar peças inativas"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr "Ocultar peças inativas nos resultados exibidos na página inicial"
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Mostrar peças subscritas"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Mostrar peças subscritas na tela inicial"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Mostrar categorias subscritas"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Mostrar categorias de peças subscritas na tela inicial"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Mostrar peças mais recentes"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Mostrar as peças mais recentes na página inicial"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Mostrar LDMs não validadas"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Mostrar LDMs que aguardam validação na página inicial"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Mostrar alterações recentes de estoque"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Mostrar itens de estoque alterados recentemente na página inicial"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Mostrar estoque baixo"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Mostrar itens de baixo estoque na página inicial"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Mostrar estoque esgotado"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Mostrar itens sem estoque na página inicial"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Mostrar estoque necessário"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Mostrar itens de estoque necessários para produções na tela inicial"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Mostrar estoque expirado"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Mostrar expirados itens em estoque na tela inicial"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Mostrar estoque inativo"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Mostrar estoque inativo na tela inicial"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Mostrar produções pendentes"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Mostrar produções pendentes na tela inicial"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Mostrar produções atrasadas"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Mostrar produções atrasadas na tela inicial"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr "Mostrar pedidos de compra pendentes"
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr "Mostrar os Pedidos de Compras pendentes na página inicial"
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Mostrar Pedidos de Compra atrasados"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr "Mostrar os Pedidos de Compras atrasadas na tela inicial"
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr "Mostrar pedidos de vendas pendentes"
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr "Mostrar os Pedidos de Vendas pendentes na página inicial"
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Mostrar Pedidos de Venda atrasados"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr "Mostrar os Pedidos de Vendas atrasadas na tela inicial"
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr "Mostrar remessas de OV pendentes"
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr "Mostrar envios OV pendentes na tela inicial"
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Mostrar notícias"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Mostrar notícias na tela inicial"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "Mostrar etiqueta em linha"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "Mostrar etiquetas em PDF no navegador, ao invés de baixar o arquivo"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr "Impressora de etiquetas padrão"
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr "Configurar qual impressora de etiqueta deve ser selecionada por padrão"
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr "Mostrar relatório em linha"
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "Mostrar relatórios em PDF no navegador, ao invés de baixar o arquivo"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Procurar Peças"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr "Mostrar peças na janela de visualização de pesquisa"
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr "Buscar Peças do Fornecedor"
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr "Mostrar fornecedor de peças na janela de visualização de pesquisa"
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Buscar peças do fabricante"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr "Mostrar fabricante de peças na janela de visualização de pesquisa"
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Ocultar peças inativas"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr "Não incluir peças inativas na janela de visualização de pesquisa"
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr "Pesquisar Categorias"
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr "Mostrar categoria das peças na janela de visualização de pesquisa"
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Pesquisar Estoque"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Mostrar itens do estoque na janela de visualização de pesquisa"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Ocultar itens do estoque indisponíveis"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Não incluir itens de estoque que não estão disponíveis na janela de visualização de pesquisa"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Procurar Locais"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr "Mostrar locais de estoque na janela de visualização de pesquisa"
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Pesquisar empresas"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr "Mostrar empresas na janela de visualização de pesquisa"
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Procurar Pedidos de Produção"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr "Mostrar pedidos de produção na janela de visualização de pesquisa"
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Mostrar Pedido de Compras"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr "Mostrar pedidos de compra na janela de visualização de pesquisa"
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Não incluir Pedidos de Compras Inativos"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr "Não incluir pedidos de compras inativos na janela de visualização de pesquisa"
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Procurar Pedidos de Vendas"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr "Mostrar pedidos de vendas na janela de visualização de pesquisa"
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr "Não Incluir Pedidos de Compras Inativas"
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr "Não incluir pedidos de vendas inativos na janela de visualização de pesquisa"
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Procurar Pedidos de Devolução"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr "Mostrar pedidos de devolução na janela de visualização de pesquisa"
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr "Não Incluir Pedidos de Devolução Inativas"
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr "Não incluir pedidos de devolução inativos na janela de visualização de pesquisa"
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "Mostrar Resultados Anteriores"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr "Número de resultados mostrados em cada seção da janela de visualização de pesquisa"
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Pesquisa de Regex"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr "Permitir expressôes comuns nas conultas de pesquisas"
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr "Busca de Palavras Inteira"
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr "Pesquisa retorna que palavra inteira coincide"
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Mostrar Quantidade nos Formulários"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "Mostrar a quantidade de peças disponíveis em alguns formulários"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr "Tecla Esc Fecha Formulários"
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr "Usar a tecla Esc para fechar fomulários modais"
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Fixar Navbar"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr "A posição do Navbar é fixa no topo da tela"
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Formato da data"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Formato preferido para mostrar datas"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Agendamento de peças"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr "Mostrar informações de agendamento de peças"
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr "Balanço de Peça"
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr "Mostrar informação de balanço da peça (se a funcionalidade de balanço estiver habilitada)"
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr "Comprimento da Tabela de Frases"
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr "Limite máximo de comprimento para frases exibidas nas visualizações de tabela"
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr "Modelo de rótulo padrão da peça"
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr "O modelo de rótulo da peça a ser selecionado automaticamente"
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr "Modelo padrão de item de estoque"
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr "O modelo de rótulo do item a ser selecionado automaticamente"
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr "Modelo de rótulo de localização do estoque padrão"
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr "O modelo de rótulo do local de estoque a ser selecionado automaticamente"
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr "Receber relatório de erros"
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr "Receber notificações para erros do sistema"
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr "Últimas máquinas de impressão utilizadas"
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr "Salvar as últimas máquinas de impressão usadas para um usuário"
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr "Quantidade de Parcelamentos"
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr "Quantidade de Parcelamentos"
 msgid "Price"
 msgstr "Preço"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr "Preço unitário na quantidade especificada"
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Ponto final"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr "Ponto final em qual o gancho web foi recebido"
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr "Nome para este webhook"
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr "Nome para este webhook"
 msgid "Active"
 msgstr "Ativo"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr "Este gancho web está ativo"
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Token"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Token de acesso"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Segredo"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr "Segredo compartilhado para HMAC"
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "ID da Mensagem"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr "Identificador exclusivo desta mensagem"
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Servidor"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr "Servidor do qual esta mensagem foi recebida"
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Cabeçalho"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "Cabeçalho da mensagem"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Corpo"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr "Corpo da mensagem"
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr "Ponto do qual esta mensagem foi recebida"
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr "Trabalhado em"
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr "O trabalho desta mensagem foi concluído?"
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Id"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Título"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Publicado"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Autor"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Resumo"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Lida"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr "Esta notícia do item foi lida?"
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr "Esta notícia do item foi lida?"
 msgid "Image"
 msgstr "Imagem"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "Arquivo de imagem"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr "Nome da unidade deve ser um identificador válido"
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr "Nome da unidade"
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr "Símbolo"
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr "Símbolo de unidade opcional"
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr "Definição"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr "Definição de unidade"
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr "Link para as informações do endereço (externo)"
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Peça base"
@@ -3977,7 +3985,7 @@ msgstr "Selecionar peça"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Selecionar fabricante"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr "Valor do Parâmetro"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr "Parte do fabricante vinculado deve fazer referência à mesma peça base
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "Fornecedor"
 msgid "Select supplier"
 msgstr "Selecione o fornecedor"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Unidade de reserva de estoque fornecedor"
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr "Descrição da peça fornecedor"
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Anotação"
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Taxa mínima (ex.: taxa de estoque)"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr "Excluir imagem"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr "Nenhuma informação do fabricante disponível"
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr "Nenhuma informação do fornecedor está disponível"
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr "Atualizar Disponibilidade de Peças"
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr "Etiqueta"
 msgid "Label template file"
 msgstr "Arquivo de modelo de etiqueta"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "Altura [mm]"
 msgid "Label height, specified in mm"
 msgstr "Altura da Etiqueta, em mm"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Padrão de Nome de Arquivo"
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr "Filtros de consulta (lista de valores separados por vírgula)"
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Filtros"
 
@@ -4846,11 +4854,11 @@ msgstr "Devolver pedido"
 msgid "Total price for this order"
 msgstr "Preço total deste pedido"
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr "Moeda do pedido"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr "Moeda para este pedido (deixe em branco para usar o padrão da empresa)"
 
@@ -5037,7 +5045,7 @@ msgstr "Recebido"
 msgid "Number of items received"
 msgstr "Número de itens recebidos"
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr "Verificado por"
 msgid "User who checked this shipment"
 msgstr "Usuário que verificou esta remessa"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Remessa"
 
@@ -5141,7 +5149,7 @@ msgstr "Não é possível alocar uma linha sem uma peça"
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "A quantidade de alocação não pode exceder a quantidade em estoque"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Quantidade deve ser 1 para item de estoque serializado"
 
@@ -5215,159 +5223,159 @@ msgstr "Gastos com esta linha de itens"
 msgid "Cost associated with return or repair for this line item"
 msgstr "Gastos para reparar e/ou devolver esta linha de itens"
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "Pedido não pode ser cancelado"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr "Permitir que o pedido seja fechado com itens de linha incompletos"
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr "O pedido tem itens da linha incompletos"
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "O pedido não está aberto"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Moeda de preço de compra"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr "A peça do fornecedor deve ser especificada"
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr "O pedido de compra deve ser especificado"
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr "O fornecedor deve corresponder o pedido de compra"
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr "Pedido de compra deve corresponder ao fornecedor"
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr "Itens de linha"
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr "O item de linha não corresponde ao pedido de compra"
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr "Selecione o local de destino para os itens recebidos"
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr "Digite o código do lote para itens de estoque recebidos"
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Digite o número de série para itens de estoque recebidos"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Código de barras"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr "Código de barras lido"
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "Código de barras já em uso"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Quantidade inteira deve ser fornecida para peças rastreáveis"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr "Itens de linha deve ser providenciados"
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr "Loca de destino deve ser especificado"
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr "Código de barras fornecido deve ser único"
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr "Moeda de preço de venda"
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr "Nenhum detalhe da remessa fornecido"
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr "Item de linha não está associado a este pedido"
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr "Quantidade deve ser positiva"
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Digite números de série para alocar"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr "O pedido já foi enviado"
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr "O envio não está associado a este pedido"
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr "Nenhuma correspondência encontrada para os seguintes números de série"
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr "Os seguintes números de série já estão alocados"
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr "Devolver item do pedido"
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr "Item do pedido não bate com o pedido de devolução"
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr "Item do pedido já foi recebido"
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr "Itens só podem ser recebidos de pedidos em processamento"
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr "Tipo de moeda para o item do pedido"
 
@@ -5771,12 +5779,12 @@ msgstr "Atualizado {part} unid.-preço para {price}"
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr "Atualizado {part} unid.-preço para {price} e quantidade para {qty}"
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "ID da Peça"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Nome da Peça"
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr "IPN"
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Revisão"
@@ -5869,8 +5877,8 @@ msgstr "Nome Paternal"
 msgid "Category Path"
 msgstr "Caminho da Categoria"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr "ID Item LDM"
 msgid "Parent IPN"
 msgstr "IPN Paternal"
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr "IPN da Peça"
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr "Preço Mínimo"
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr "Validar a Lista de Materiais completa"
 msgid "This option must be selected"
 msgstr "Esta opção deve ser selecionada"
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Local Padrão"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Estoque Total"
@@ -6008,7 +6016,7 @@ msgstr "Estoque Total"
 msgid "Input quantity for price calculation"
 msgstr "Quantidade para o cálculo de preço"
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Categoria da Peça"
@@ -6090,7 +6098,7 @@ msgstr "Uma parte com este Nome, IPN e Revisão já existe."
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr "Peças não podem ser atribuídas a categorias estruturais!"
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Nome da peça"
 
@@ -6424,604 +6432,610 @@ msgstr "Número de peças cobertas pelo Balanço"
 msgid "User who requested this stocktake report"
 msgstr "Usuário que solicitou este relatório de balanço"
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr "Modelos de teste só podem ser criados para peças rastreáveis"
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Test with this name already exists for this part"
+msgid "Test template with the same key already exists for part"
 msgstr "O teste com este nome já existe para esta peça"
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Nome de Teste"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr "Insira um nome para o teste"
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Descrição do Teste"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr "Digite a descrição para este teste"
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Requerido"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr "Este teste é obrigatório passar?"
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Requer Valor"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr "Este teste requer um valor ao adicionar um resultado de teste?"
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr "Anexo obrigatório"
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr "Este teste requer um anexo ao adicionar um resultado de teste?"
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr "Parâmetros da caixa de seleção não podem ter unidades"
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr "Os parâmetros da caixa de seleção não podem ter escolhas"
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr "Escolhas devem ser únicas"
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr "Nome do modelo de parâmetro deve ser único"
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr "Nome do Parâmetro"
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr "Unidades físicas para este parâmetro"
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr "Descrição do Parâmetro"
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr "Caixa de seleção"
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr "Este parâmetro é uma caixa de seleção?"
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr "Escolhas"
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr "Opções válidas para este parâmetro (separadas por vírgulas)"
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr "Escolha inválida para valor do parâmetro"
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr "Peça Paternal"
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Modelo de parâmetro"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Dados"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Valor do Parâmetro"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Valor Padrão"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr "Valor Padrão do Parâmetro"
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr "ID da peça ou nome da peça"
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr "Valor exclusivo do ID de peça"
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr "Valor da parte IPN"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr "Nível"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr "Nível da LDM"
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr "Selecione a Peça Parental"
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr "Sub peça"
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr "Selecionar peça a ser usada na LDM"
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr "Quantidade de LDM para este item LDM"
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr "Este item LDM é opcional"
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr "Este item LDM é consumível (não é rastreado nos pedidos de construção)"
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr "Excedente"
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Quantidade estimada de desperdício (absoluto ou porcentagem)"
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr "Referência do Item LDM"
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr "Notas do Item LDM"
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr "Soma de verificação"
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr "Soma de Verificação da LDM da linha"
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "Validado"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr "O item da LDM foi validado"
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr "Obtém herdados"
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr "Este item da LDM é herdado por LDMs para peças variáveis"
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Permitir variações"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr "Itens de estoque para as peças das variantes podem ser usados para este item LDM"
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr "Quantidade deve ser valor inteiro para peças rastreáveis"
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr "Sub peça deve ser especificada"
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr "Substituir Item da LDM"
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr "A peça de substituição não pode ser a mesma que a peça mestre"
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr "Item LDM Parental"
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr "Substituir peça"
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr "Parte 1"
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr "Parte 2"
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr "Selecionar Peça Relacionada"
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr "Relacionamento da peça não pode ser criada com ela mesma"
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr "Relação duplicada já existe"
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Sub-categorias"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Moeda de compra deste item de estoque"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr "Nenhuma parte selecionada"
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr "Selecionar categoria"
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr "Peça Original"
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr "Selecione a peça original para duplicar"
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Copiar imagem"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr "Copiar imagem da peça original"
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr "Copiar LDM"
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr "Copiar lista de materiais da peça original"
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Copiar Parâmetros"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr "Copiar dados do parâmetro da peça original"
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr "Copiar Notas"
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr "Copiar imagem da peça original"
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr "Quantidade Inicial de Estoque"
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr "Especificar a quantidade inicial de estoque para a peça. Se for zero, nenhum estoque é adicionado."
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr "Local Inicial do Estoque"
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr "Especifique o local do estoque inicial para esta Peça"
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr "Selecione o fornecedor (ou deixe em branco para pular)"
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr "Selecione fabricante (ou deixe em branco para pular)"
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr "Número de Peça do Fabricante"
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr "A empresa selecionada não é um fornecedor válido"
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr "A empresa selecionada não é um fabricante válido"
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr "A peça do fabricante que corresponde a essa MPN já existe"
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr "A peça do fornecedor que corresponde a essa SKU já existe"
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "Exclude External Stock"
 msgid "External Stock"
 msgstr "Excluir Estoque externo"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Allocated Stock"
 msgid "Unallocated Stock"
 msgstr "Estoque Alocado"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 #, fuzzy
 #| msgid "Part Stock"
 msgid "Variant Stock"
 msgstr "Estoque da Peça"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "Peça duplicada"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr "Copiar dados iniciais de outra peça"
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr "Estoque inicial"
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr "Criar peça com a quantidade inicial de estoque"
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr "Informações do Fornecedor"
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr "Adicionar informação inicial de fornecedor para esta peça"
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr "Copiar Parâmetros da Categoria"
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr "Copiar modelos de parâmetros a partir de categoria de peça selecionada"
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr "Imagem Existente"
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr "Nome de arquivo de uma imagem de peça existente"
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr "A imagem não existe"
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr "Limitar o relatório de balanço a uma determinada peça e quaisquer peças variantes"
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr "Limitar o relatório de balanço a uma determinada categoria, e qualquer peças filhas"
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr "Limitar o relatório de balanço a um determinado local de estoque, e qualquer local filho"
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr "Excluir Estoque externo"
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr "Excluir itens de estoque em locais externos"
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Gerar relatório"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr "Gerar arquivo de relatório contendo dados de estoque calculados"
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr "Atualizar Peças"
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr "Atualizar peças especificadas com dados de estoque calculados"
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr "Função de Balanço de Estoque não está ativada"
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr "Sobrepor valor calculado para preço mínimo"
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr "Moeda do preço mínimo"
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr "Sobrepor valor calculado para preço máximo"
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr "Moeda do preço máximo"
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr "Atualizar"
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr "Atualizar preços desta peça"
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr "Não foi possível converter das moedas fornecidas para {default_currency}"
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr "Preço mínimo não pode ser maior que o preço máximo"
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr "Preço máximo não pode ser menor que o preço mínimo"
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr "Selecionar peça para copiar a LDM"
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr "Remover Dado Existente"
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr "Remova itens LDM existentes antes de copiar"
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr "Incluir Herdados"
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr "Incluir itens LDM que são herdados de peças modelo"
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr "Pular Linhas inválidas"
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr "Habilitar esta opção para pular linhas inválidas"
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr "Copiar Peças Substitutas"
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr "Copiar peças de substitutas quando duplicar itens de LDM"
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr "Limpar LDM Existente"
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr "Apagar itens LDM existentes antes de carregar"
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr "Nenhuma coluna de peça especificada"
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr "Múltiplas peças correspondentes encontradas"
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr "Nenhuma peça correspondente encontrada"
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr "Peça não está designada como componente"
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr "Quantidade não foi fornecida"
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Quantidade Inválida"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr "Pelo menos um item LDM é necessário"
 
@@ -8031,7 +8045,7 @@ msgstr "Borda"
 msgid "Print a border around each label"
 msgstr "Imprima uma borda em torno de cada etiqueta"
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr "Paisagem"
 
@@ -8339,16 +8353,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "Nenhum objeto válido fornecido para o modelo"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr "Arquivo modelo '{template}' perdido ou não existe"
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr "Relatório de teste"
 
@@ -8368,103 +8382,115 @@ msgstr "Ofício"
 msgid "Letter"
 msgstr "Carta"
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Nome do modelo"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "Arquivo modelo de relatório"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr "Descrição do modelo de relatório"
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr "Relatar número de revisão (auto-incrementos)"
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr "Tamanho da página para relatórios PDF"
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr "Renderizar relatório em orientação paisagem"
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr "Padrão para gerar nomes de arquivo de relatórios"
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr "Modelo de relatório Habilitado"
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr "Filtros de consulta de itens de estoque(lista de valores separados por vírgula)"
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr "Incluir testes instalados"
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr "Incluir resultados de testes para itens de estoque instalados dentro de item montado"
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr "Filtros de Produção"
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr "Filtros de consulta de produção (lista de valores separados por vírgula"
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Filtros de Peças"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr "Filtros de consulta de peças (lista de valores separados por vírgula"
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr "Filtros de consultas de pedidos de compra"
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr "Filtros de consultas de pedidos de venda"
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr "Filtrar pesquisa de itens devolvidos"
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Stock item with this serial number already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Item em estoque com este número de série já existe"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Recorte"
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr "Relatar arquivo de recorte"
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr "Descrição do arquivo de recorte"
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Anexo ja existe"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr "Patrimônio"
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr "Reportar arquivo de ativos"
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr "Descrição do arquivo de ativos"
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr "filtros de consulta de locais de estoque(lista de valores separados por vírgula)"
 
@@ -8771,7 +8797,7 @@ msgstr "Você não pode tornar este local do estoque estrutural, pois alguns ite
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr "Os itens de estoque não podem estar localizados em locais de estoque estrutural!"
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr "Item de estoque não pode ser criado para peças virtuais"
 
@@ -8816,7 +8842,7 @@ msgstr "Selecione uma peça do fornecedor correspondente para este item de estoq
 msgid "Where is this stock item located?"
 msgstr "Onde está localizado este item de estoque?"
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr "Embalagem deste item de estoque está armazenado em"
 
@@ -8828,7 +8854,7 @@ msgstr "Este item está instalado em outro item?"
 msgid "Serial number for this item"
 msgstr "Número de série para este item"
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr "Código do lote para este item de estoque"
 
@@ -8905,7 +8931,7 @@ msgstr "Números de série devem ser uma lista de números inteiros"
 msgid "Quantity does not match serial numbers"
 msgstr "A quantidade não corresponde aos números de série"
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Números de série já existem"
 
@@ -8937,7 +8963,7 @@ msgstr "Item no estoque está em produção no momento"
 msgid "Serialized stock cannot be merged"
 msgstr "Itens de série não podem ser mesclados"
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr "Item de estoque duplicado"
 
@@ -8985,184 +9011,184 @@ msgstr "Anexo do resultado do teste"
 msgid "Test notes"
 msgstr "Notas do teste"
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr "Número de série é muito grande"
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr "Usar tamanho do pacote ao adicionar: a quantidade definida é o número de pacotes"
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr "Preço de compra para este item de estoque, por unidade ou pacote"
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr "Insira o número de itens de estoque para serializar"
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr "Quantidade não deve exceder a quantidade disponível em estoque ({q})"
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "Inserir número de série para novos itens"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr "Local de destino do estoque"
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr "Campo opcional de notas"
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr "Números de série não podem ser atribuídos a esta peça"
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr "Selecione o item de estoque para instalar"
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr "Quantidade a Instalar"
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr "Insira a quantidade de itens a instalar"
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr "Adicionar nota de transação (opcional)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr "A quantidade para instalar deve ser pelo menos 1"
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr "Item de estoque indisponível"
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr "Peça selecionada não está na Lista de Materiais"
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr "Quantidade a instalar não deve exceder a quantidade disponível"
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr "Local de destino para o item desinstalado"
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr "Selecione peça para converter o item de estoque em"
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr "Peça selecionada não é uma opção válida para conversão"
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr "Não é possível converter o item de estoque com a Peça de Fornecedor atribuída"
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr "Local de destino para item retornado"
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr "Selecionar itens de estoque para mudar estados"
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr "Nenhum item de estoque selecionado"
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Sub-locais"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr "Parte deve ser comercializável"
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr "Item é alocado para um pedido de venda"
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr "Item está alocado a um pedido de produção"
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr "Cliente para atribuir itens de estoque"
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr "A empresa selecionada não é um cliente"
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr "Nodas atribuídas a estoque"
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr "Uma lista de item de estoque deve ser providenciada"
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr "Notas de fusão de estoque"
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr "Permitir fornecedores divergentes"
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr "Permitir a fusão de itens de estoque de fornecedores diferentes"
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr "Permitir estado incompatível"
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr "Permitir a fusão de itens de estoque com estado diferentes"
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr "Ao menos dois itens de estoque devem ser providenciados"
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr "Valor da chave primária do Item Estoque"
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr "Código de estado do item estoque"
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr "Notas da transação de estoque"
 
diff --git a/InvenTree/locale/ru/LC_MESSAGES/django.po b/InvenTree/locale/ru/LC_MESSAGES/django.po
index 9fe605722428..0f1547a32c1b 100644
--- a/InvenTree/locale/ru/LC_MESSAGES/django.po
+++ b/InvenTree/locale/ru/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-03-06 10:36\n"
 "Last-Translator: \n"
 "Language-Team: Russian\n"
@@ -30,20 +30,20 @@ msgstr "У пользователя недостаточно прав для п
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Значение не указано"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Невозможно преобразовать {original} в {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Недопустимое количество"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Недопустимое количество ({exc})"
@@ -65,9 +65,9 @@ msgstr "Введите дату"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Указанный домен электронной почты не у
 msgid "Registration is disabled."
 msgstr "Регистрация отключена."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "недопустимое количество"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Пустая строка серийного номера"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Повторяющийся серийный номер"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Недопустимый диапазон группы: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Диапазон группы {group} превышает допустимое количество ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Неверная последовательность групп: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Серийных номеров не найдено"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Число уникальных серийных номеров ({s}) должно соответствовать количеству ({q})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Удалить HTML теги из этого значения"
 
@@ -401,7 +401,7 @@ msgstr "Вложения"
 msgid "Select file to attach"
 msgstr "Выберите файл для вложения"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Комментарий"
 msgid "File comment"
 msgstr "Комментарий к файлу"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Повторяющиеся имена не могут существов
 msgid "Invalid choice"
 msgstr "Неверный выбор"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Название"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Ошибка сервера"
 msgid "An error has been logged by the server."
 msgstr "Сервер зарегистрировал ошибку."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Должно быть действительным номером"
 
@@ -678,7 +678,7 @@ msgstr "ССЫЛКА файла изображения на удаленном 
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Загрузка изображений с удаленного URL-адреса не включена"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Проверка фонового работника не удалась"
 
@@ -938,14 +938,14 @@ msgstr "О программе InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Заказ на производство должен быть отменен перед удалением"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Расходники"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Ссылка на заказ на производство"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Заказ на производство, которому принад
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Заказ на производство, которому принад
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Статус заказа на производство"
 msgid "Build status code"
 msgstr "Код статуса заказа на производство"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Код партии"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Продукция не совпадает с заказом на производство"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Количество должно быть больше нуля"
 
@@ -1285,10 +1285,10 @@ msgstr "Объект производства"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Объект производства"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Количество должно быть 1 для сериализов
 msgid "Selected stock item does not match BOM line"
 msgstr "Выбранная складская позиция не соответствует позиции в BOM"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Для отслеживаемых деталей должно быть 
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Требуется целое количество, так как материал содержит отслеживаемые детали"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Серийные номера"
@@ -1451,10 +1451,10 @@ msgstr "Следующие серийные номера уже существу
 msgid "A list of build outputs must be provided"
 msgstr "Необходимо представить список выхода деталей"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Место хранения для завершенной продукц
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Подтвердите, что складские позиции не б
 msgid "Required stock has not been fully allocated"
 msgstr "Необходимые запасы не были полностью зарезервированы"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Разрешить незавершенные производимые детали"
 
@@ -1602,11 +1602,11 @@ msgstr "Позиция для производства"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part должна указывать на ту же часть, что и заказ на производство"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "Элемент должен быть в наличии"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Превышено доступное количество ({q})"
@@ -1619,7 +1619,7 @@ msgstr "Продукция должна быть указан для резер
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "Продукция не может быть указана для резервирования не отслеживаемых частей"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Необходимо указать резервируемые элементы"
 
@@ -1659,7 +1659,7 @@ msgstr "Необязательные элементы"
 msgid "Allocate optional BOM items to build order"
 msgstr "Зарезервировать необязательные позиции BOM для заказа на производство"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Позиция BOM"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr "Зарезервированные Запасы"
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr "Зарезервированные Запасы"
 msgid "On Order"
 msgstr "В заказе"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr "В производстве"
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1400 @@ msgstr "Описание проекта"
 msgid "User or group responsible for this project"
 msgstr "Пользователь или группа, ответственные за этот проект"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Ключ настроек (должен быть уникальным - не чувствителен к регистрам)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Значения настроек"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "Выбранное значение не является допустимым"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "Значение должно быть булевым"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "Значение должно быть целым числом"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "Строка ключа должна быть уникальной"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Нет группы"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Пустой домен не допускается."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Недопустимое доменное имя: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Нет плагина"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Требуется перезапуск"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "Настройки были изменены, что требует перезапуска сервера"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Ожидаемые миграции"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr "Количество ожидаемых миграций базы данных"
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Название сервера"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "Текстовое описание сервера"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Название инстанса"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Имя сервера в заголовке"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Ограничить отображение `О...`"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Показать `О...` только суперпользователям"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Название компании"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Внутреннее название компании"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "Базовая ссылка"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "Базовая ссылка для экземпляра сервера"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Валюта по умолчанию"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr "Выберите базовую валюту для расчета цены"
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr "Как часто обновлять курс валют (установите \"ноль\", чтобы выключить)"
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "дней"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr "Плагин обновления валют"
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Скачать по ссылке"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Разрешить загрузку удаленных изображений и файлов по внешнему URL"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Ограничение размера загрузки"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Максимально допустимый размер загрузки для удалённого изображения"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "User-Agent, используемый для загрузки из URL"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "Позволяет переопределить user-Agent, используемый для загрузки изображений и файлов с внешнего URL (оставьте пустым по умолчанию)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr "Строгая проверка URL-адреса"
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr "Требуется спецификация схемы при проверке URL-адресов"
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Требуется подтверждение"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Требовать явное подтверждение пользователя для определенного действия."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Глубина дерева"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Глубина дерева по умолчанию для просмотра дерева. Глубокие уровни загружены по мере необходимости."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Интервал проверки обновлений"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Как часто проверять наличие обновлений (установите ноль чтобы выключить)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Автоматическое резервное копирование"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Включить автоматическое резервное копирование базы данных и медиа-файлов"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Интервал резервного копирования"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Укажите количество дней между событиями автоматического резервного копирования"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Интервал удаления задачи"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "Результаты фоновых задач будут удалены после указанного количества дней"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr "Интервал удаления журнала ошибок"
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "Журналы ошибок будут удалены после указанного количества дней"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr "Интервал удаления уведомления"
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Уведомления пользователя будут удалены после указанного количества дней"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Поддержка штрих-кодов"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr "Включить поддержку сканера штрих-кодов в веб-интерфейсе"
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Задержка сканирования штрих-кода"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Время задержки обработки штрих-кода"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Поддержка веб-камер штрих-кодов"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Разрешить сканирование штрих-кода через веб-камеру в браузере"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr "Ревизия детали"
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Шаблон регулярного выражения для сопоставления IPN детали"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Разрешить повторяющиеся IPN"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Разрешить редактирование IPN"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Разрешить изменение значения IPN при редактировании детали"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Скопировать данные BOM детали"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Копировать данные BOM по умолчанию при дублировании детали"
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Скопировать данные параметров детали"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Копировать данных параметров по умолчанию при дублировании детали"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Скопировать данные тестирования детали"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Копировать данные тестирования по умолчанию при дублировании детали"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Скопировать параметры по шаблону категории"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Копировать параметры по шаблону категории при создании детали"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Шаблон"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "По умолчанию детали являются шаблонами"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Производимая деталь"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "По умолчанию детали могут быть собраны из других компонентов"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Компонент"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "По умолчанию детали могут использоваться в качестве суб-компонентов"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Можно купить"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "По умолчанию детали являются отслеживаемыми"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Можно продавать"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Детали продаются по умолчанию"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Отслеживание"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "По умолчанию детали являются отслеживаемыми"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Виртуальная"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Детали являются виртуальными по умолчанию"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Показывать связанные детали"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Исходные данные о поставщике"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Использовать цены из складских позиций"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "Использовать расценки из ручного ввода данных о запасах для расчета цен"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Возраст цен складских позиций"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Исключить складские позиции старше указанного количества дней с расчёта цен"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Только Активные Варианты"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr "Интервал пересчета цен"
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Внутренние цены"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Включить отчеты"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Режим отладки"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+#, fuzzy
+#| msgid "No Reports Found"
+msgid "Log Report Errors"
+msgstr "Отчёты не найдены"
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Размер страницы"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "При печати отчета о тестировании приложить копию тестового отчета к соответствующему складской позиции"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "Серийные номера для складских позиций должны быть уникальными глобально"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Определяет поведение по умолчанию, когда складская позиция заканчивается"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Шаблон для создания кодов партии по умолчанию для складских позиций"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Срок годности Запасов"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Время Залежалости Запасов"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Количество дней перед тем как складская единица будет считаться просроченной"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Использовать просроченные остатки в производстве"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Разрешить использовать просроченные остатки в производстве"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr "Показать установленные складские позиции"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr "Отображать установленные складские позиции в складских таблицах"
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Паттерн ссылки заказа на производство"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Поле требуемого паттерна для создания ссылки заказа на производство"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr "Включить заказы на возврат"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Редактировать завершенные заказы на покупку"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "Включить SSO"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Необходимо указать EMail"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "Написать дважды"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Пароль дважды"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Разрешенные домены"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Принудительное MFA"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Пользователи должны использовать многофакторную безопасность."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Проверять плагины при запуске"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr "Исключить складские позиции во внешних местах хранения из инвентаризации"
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Показывать детали, на которые включены уведомления"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Показывать детали, на которые включены уведомления, на главной странице"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Показывать категории, на которые включены уведомления"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Показывать категории, на которые включены уведомления, на главной странице"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Показывать последние детали"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Показывать последние детали на главной странице"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Показывать непроверенные BOMы"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Показывать BOMы, ожидающие проверки, на главной странице"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Показывать изменившиеся складские запасы"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Показывать складские позиции с недавно изменившимися запасами на главной странице"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Показывать низкие складские запасы"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Показывать складские позиции с низкими запасами на главной странице"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Показывать закончившиеся складские позиции"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Показывать закончившиеся складские позиции на главной странице"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Показывать требуемые складские позиции"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Показывать требуемые для производства складские позиции на главной странице"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Показывать складские позиции с истекшим сроком годности"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Показывать складские позиции с истёкшим сроком годности на главной странице"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Показывать залежалые складские позиции"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Показывать складские позиции с истекающим сроком годности на главной странице"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Показывать незавершённые производства"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Показывать незавершённые производства на главной странице"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Показывать просроченные производства"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Показывать просроченные производства на главной странице"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Показать просроченные заказы на производство"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Показать просроченные заказы на продажу"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Показывать новости"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Поиск Деталей"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Поиск Запасов"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Отображать складские позиции в окне предварительного просмотра поиска"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Скрыть недоступные складские позиции"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Исключить недоступные складские позиции из окна предварительного просмотра поиска"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Поиск мест хранения"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Поиск компаний"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Поиск заказов на производство"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr "Отображать заказы на производство в окне предварительного просмотра поиска"
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Поиск заказов на продажу"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Поиск заказов на возврат"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Поиск по Regex"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Фиксированная панель навигации"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Формат даты"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Планирование деталей"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr "Инвентаризация детали"
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr "Шаблон складской позиции по умолчанию"
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr "Шаблон метки складской позиции для автоматического выбора"
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3518,23 @@ msgstr ""
 msgid "Price"
 msgstr "Цена"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Конечная точка"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3544,101 @@ msgstr ""
 msgid "Active"
 msgstr "Активный"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Токен"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Токен для доступа"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Секрет"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "ID Сообщения"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Хост"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Заголовок"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Тело"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr "Работал над"
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Код"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Заголовок"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Опубликовано"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Автор"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Итого"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Читать"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3648,31 @@ msgstr ""
 msgid "Image"
 msgstr "Изображение"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "Файл изображения"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr "Название единицы"
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr "Символ"
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr "Определение"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3976,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Базовая деталь"
@@ -3977,7 +3987,7 @@ msgstr "Выберите деталь"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4002,7 @@ msgid "Select manufacturer"
 msgstr "Выберите производителя"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4048,7 @@ msgid "Parameter value"
 msgstr "Значение параметра"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4074,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4091,7 @@ msgstr "Поставщик"
 msgid "Select supplier"
 msgstr "Выберите поставщика"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Код поставщика"
 
@@ -4098,13 +4108,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Запись"
 
@@ -4117,7 +4127,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4233,7 @@ msgstr "Удалить изображение"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4444,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4544,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4594,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4657,7 @@ msgstr "Метка"
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4683,7 @@ msgstr "Высота [мм]"
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Шаблон имени файла"
 
@@ -4687,8 +4697,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Фильтры"
 
@@ -4846,11 +4856,11 @@ msgstr "Заказ на возврат"
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr "Валюта Заказа"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5047,7 @@ msgstr "Получено"
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5102,8 @@ msgstr "Проверн"
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Отправление"
 
@@ -5141,7 +5151,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Количество должно быть 1 для сериализированных складских позиций"
 
@@ -5215,159 +5225,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "Заказ не открыт"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Валюта цены закупки"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr "Позиция"
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr "Выберите место назначения для полученных элементов"
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr "Введите код партии для поступающих складских позиций"
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Введите серийные номера для входящих складских позиций"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Штрих-код"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr "Сканированный штрих-код"
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Для отслеживаемых деталей должно быть указано целочисленное количество"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr "Валюта цены продажи"
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Введите серийные номера для резервирования"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5781,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "Код детали"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Наименование детали"
@@ -5793,7 +5803,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Ревизия"
@@ -5869,8 +5879,8 @@ msgstr "Имя родителя"
 msgid "Category Path"
 msgstr "Путь к категории"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5903,17 @@ msgstr "ID Элемента BOM"
 msgid "Parent IPN"
 msgstr "Родительский IPN"
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr "IPN детали"
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr "Минимальная цена"
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5991,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr "Необходимо выбрать эту опцию"
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6009,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Место хранения по умолчанию"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Общий запас"
@@ -6008,7 +6018,7 @@ msgstr "Общий запас"
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Категория детали"
@@ -6090,7 +6100,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Наименование детали"
 
@@ -6424,598 +6434,604 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr "Шаблоны тестирования могут быть созданы только для отслеживаемых деталей"
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
-msgstr ""
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Stock item with this serial number already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Складская позиция с этим серийным номером уже существует"
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Название теста"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr "Введите имя для теста"
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Описание теста"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr "Введите описание для этого теста"
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Требуется"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Требуется значение"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr "Название параметра"
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr "Чекбокс"
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr "Варианты"
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr "Родительская деталь"
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Шаблон параметра"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Данные"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Значение Параметра"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Значение по умолчанию"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr "Код или наименование детали"
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr "Значение IPN"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr "Уровень"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr "Уровень BOM"
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr "Выберите родительскую деталь"
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr "Суб-деталь"
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr "Выбрать деталь для использования в BOM"
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr "Эта позиция - расходник. (она не отслеживается в заказах на производство)"
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr "Перерасход"
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Расчетное количество перерасходов производства (абсолютное или процентное)"
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr "Записи о позиции BOM"
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr "Контрольная сумма"
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "Проверен"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Разрешить разновидности"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr "Складские позиции для разновидностей деталей могут быть использованы для этой позиции BOM"
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr "Для отслеживаемых деталей количество должно быть целым числом"
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr "Позиция BOM-родителя"
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr "Замена детали"
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr "Часть 1"
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr "Часть 2"
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr "Выберите связанную часть"
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Подкатегории"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Валюта закупки складской позиции"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr "Не выбрана ни одна деталь"
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr "Выберите категорию"
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr "Оригинальная деталь"
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Копировать Изображение"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr "Скопировать BOM"
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Скопировать параметры"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr "Копировать Записи"
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr "Скопировать записи из оригинальной детали"
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr "Выберите поставщика (или оставьте поле пустым, чтобы пропустить)"
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr "Выберите поставщика (или оставьте поле пустым, чтобы пропустить)"
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr "Код производителя"
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "Дублировать деталь"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr "Начальный запас"
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr "Копировать параметры категории"
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr "Копировать шаблоны параметров из выбранной категории деталей"
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr "Существующее изображение"
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr "Исключить складские позиции в внешних местах хранения"
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Создать отчет"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr "Обновить детали"
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr "Обновить"
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr "Подходящая деталь не найдена"
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Некорректное количество"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8041,7 @@ msgstr "Граница"
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr "Альбомная"
 
@@ -8333,16 +8349,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr "Отчет тестирования"
 
@@ -8362,103 +8378,115 @@ msgstr "Правовая информация"
 msgid "Letter"
 msgstr "Письмо"
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Название шаблона"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "Файл шаблона отчёта"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr "Включить результаты тестирования для складских позиций установленных в производимую деталь"
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr "Фильтры производства"
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr "Фильтры запросов производства (разделенные запятыми список ключей=значения пар ключей"
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Фильтры деталей"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Stock item with this serial number already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Складская позиция с этим серийным номером уже существует"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Сниппет"
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Вложение с таким именем файла уже существует"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr "Объект"
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8793,7 @@ msgstr "Вы не можете сделать это место хранение
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr "Складские позиции не могут находиться в структурных местах хранения!"
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr "Складская позиция не может быть создана для виртуальных деталей"
 
@@ -8810,7 +8838,7 @@ msgstr "Выберите соответствующего поставщика 
 msgid "Where is this stock item located?"
 msgstr "Где находиться эта складская позиция?"
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr "Упаковка этой складской позиции хранится в"
 
@@ -8822,7 +8850,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr "Код партии для этой складской позиции"
 
@@ -8899,7 +8927,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Серийные номера уже существуют"
 
@@ -8931,7 +8959,7 @@ msgstr "Складская позиция в производстве"
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr "Дублировать складские позиции"
 
@@ -8979,184 +9007,184 @@ msgstr ""
 msgid "Test notes"
 msgstr "Записи Тестирования"
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr "Закупочная цена для этой складской позиции, за единицу или за упаковку"
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr "Введите количество складских позиций для сериализации"
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "Введите серийные номера для новых элементов"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr "Опциональное поле записей"
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr "Выберите складскую позицию для установки"
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr "Добавить запись к транзакции (необязательно)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr "Складская позиция недоступна"
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr "Выбранная деталь отсутствует в спецификации"
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr "Выберите деталь в которую будет преобразована складская позиция"
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr "Невозможно преобразовать складскую позицию с назначенной деталью поставщика"
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr "Выберите складские позиции для изменения статуса"
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr "Не выбрано ни одной складской позиции"
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Места хранения"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr "Элемент зарезервирован для заказа на производство"
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr "Покупатель для назначения складских позиций"
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr "Выбранная компания не является покупателем"
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr "Записи о назначенных запасах"
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr "Необходимо предоставить список складских позиций"
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr "Записи о слияниях запасов"
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr "Разрешить слияние складских позиций с различными поставщиками"
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr "Разрешить слияние складских позиций с различными статусами"
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr "Необходимо предоставить как минимум 2 складские позиции"
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr "Статус складской позиции"
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr "Записи о перемещениях запасов"
 
diff --git a/InvenTree/locale/sk/LC_MESSAGES/django.po b/InvenTree/locale/sk/LC_MESSAGES/django.po
index cc3c548673e4..90ef2cd322db 100644
--- a/InvenTree/locale/sk/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sk/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Slovak\n"
@@ -30,20 +30,20 @@ msgstr ""
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr ""
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr ""
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr ""
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr ""
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr ""
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr ""
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr ""
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr ""
 
@@ -401,7 +401,7 @@ msgstr ""
 msgid "Select file to attach"
 msgstr ""
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr ""
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr ""
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr ""
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr ""
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr ""
 
@@ -678,7 +678,7 @@ msgstr ""
 msgid "Downloading images from remote URL is not enabled"
 msgstr ""
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -938,14 +938,14 @@ msgstr ""
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,598 +6432,602 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+msgid "Test template with the same key already exists for part"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8037,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8345,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8362,103 +8374,111 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+msgid "Snippet file with this name already exists"
+msgstr ""
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+msgid "Asset file with this name already exists"
+msgstr ""
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8785,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8830,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8822,7 +8842,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8899,7 +8919,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8931,7 +8951,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8979,184 +8999,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/sl/LC_MESSAGES/django.po b/InvenTree/locale/sl/LC_MESSAGES/django.po
index bf2f3ebd2be0..ea30d9514b05 100644
--- a/InvenTree/locale/sl/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sl/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Slovenian\n"
@@ -30,20 +30,20 @@ msgstr "Uporabnik nima dovoljenja pogleda tega modela"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Vrednost ni vnesena"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Ni mogoče pretvoriti {original} v {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Vnesena napačna količina"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Vnesena napačna količina ({exc})"
@@ -65,9 +65,9 @@ msgstr "Vnesi datum"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Domena epošte ni podprta."
 msgid "Registration is disabled."
 msgstr "Registracija je onemogočena."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Podana napačna količina"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Prazno polje serijske številke"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Dvojna serijska številka"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Neveljavni doseg skupine: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Doseg skupine {group} presega dovoljene količine ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Nepravilno zaporedje skupine: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Serijske številke niso najdene"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Število unikatnih serijskih številk ({len(serials)}) se mora ujemati s količino ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Odstranite oznako HTML iz te vrednosti"
 
@@ -401,7 +401,7 @@ msgstr "Priloga"
 msgid "Select file to attach"
 msgstr "Izberite prilogo"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Komentar"
 msgid "File comment"
 msgstr "Komentar datoteke"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr "Nedovoljena izbira"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Ime"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Napaka strežnika"
 msgid "An error has been logged by the server."
 msgstr "Zaznana napaka na strežniku."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Mora biti veljavna številka"
 
@@ -678,7 +678,7 @@ msgstr "Povezava do oddaljene slike"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Prenos slik iz oddaljene povezave ni omogočen"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Nadzor dela v ozadju neuspel"
 
@@ -938,14 +938,14 @@ msgstr "O InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Izgradnja mora biti najprej preklicana, nato je lahko izbrisana"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Referenca naloga izgradnje"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Nalog izgradnje na katerega se ta izgradnaj nanaša"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Nalog izgradnje na katerega se ta izgradnaj nanaša"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Status izgradnje"
 msgid "Build status code"
 msgstr "Koda statusa izgradnje"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Številka serije"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Izgradnja se ne ujema s nalogom izdelave"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Količina za zalogo s serijsko številko mora biti 1"
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,600 +6432,606 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Priloga s tem imenom že obstaja"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "Zunanja povezava"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8027,7 +8041,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8335,16 +8349,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8364,103 +8378,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Priloga s tem imenom že obstaja"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Priloga s tem imenom že obstaja"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8767,7 +8793,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8812,7 +8838,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8824,7 +8850,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8901,7 +8927,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8933,7 +8959,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8981,184 +9007,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/sr/LC_MESSAGES/django.po b/InvenTree/locale/sr/LC_MESSAGES/django.po
index 33943d4adfd9..5cc21a28dc59 100644
--- a/InvenTree/locale/sr/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sr/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Serbian (Latin)\n"
@@ -30,20 +30,20 @@ msgstr "Korisnik nema dozvolu za pregled ovog modela"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Nije navedena vrednost"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Nije moguće konvertovati {original} u {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Isporučena nevažeća količina"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Isporučena nevažeća količina ({exc})"
@@ -65,9 +65,9 @@ msgstr "Unesite datum"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Navedeni domen adrese e-pošte nije prihvaćen."
 msgid "Registration is disabled."
 msgstr "Registracija je onemogućena."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Isporučena nevažeća količina"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Serijski broj nije popunjen"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Dupliciraj serijski broj"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Nevažeći raspon grupe: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Raspon grupe {group} prelazi dozvoljenu količinu ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Nevažeća sekvenca grupe: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Nisu pronađeni serijski brojevi"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Broj jedinstvenih serijskih brojeva ({len(serials)}) mora odgovarati količini ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Uklonite HTML oznake iz ove vrednosti"
 
@@ -401,7 +401,7 @@ msgstr "Prilog"
 msgid "Select file to attach"
 msgstr "Izaberite datoteku za prilog"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Komentar"
 msgid "File comment"
 msgstr "Datoteka komentara"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Dvostruka imena ne mogu postojati pod istom nadredjenom grupom"
 msgid "Invalid choice"
 msgstr "Nevažeći izvor"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Ime"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Greška servera"
 msgid "An error has been logged by the server."
 msgstr "Server je zabležio grešku."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Mora biti važeći broj"
 
@@ -678,7 +678,7 @@ msgstr "URL udaljene slike"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Preuzimanje slika s udaljenog URL-a nije omogućeno"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Provera pozadinskog radnika nije uspjela"
 
@@ -938,14 +938,14 @@ msgstr ""
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Reference naloga za pravljenje"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,598 +6432,604 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Prilog s ovim nazivom datoteke već postoji"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8039,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8347,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8362,103 +8376,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Prilog s ovim nazivom datoteke već postoji"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Prilog s ovim nazivom datoteke već postoji"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8791,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8836,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8822,7 +8848,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8899,7 +8925,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8931,7 +8957,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8979,184 +9005,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/sv/LC_MESSAGES/django.po b/InvenTree/locale/sv/LC_MESSAGES/django.po
index 1a63e8e1a938..26498ddd6b45 100644
--- a/InvenTree/locale/sv/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sv/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Swedish\n"
@@ -30,20 +30,20 @@ msgstr "Användaren har inte behörighet att se denna modell"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Inget värde angivet"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Kunde inte konvertera {original} till {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Ogiltigt antal angivet"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Ogiltigt antal angivet ({exc})"
@@ -65,9 +65,9 @@ msgstr "Ange datum"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Den angivna e-postdomänen är inte godkänd."
 msgid "Registration is disabled."
 msgstr "Registrering är stängd."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Ogiltigt antal angivet"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Tom serienummersträng"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Serienummret finns redan"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Inga serienummer hittades"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Ta bort HTML-taggar från detta värde"
 
@@ -401,7 +401,7 @@ msgstr "Bilaga"
 msgid "Select file to attach"
 msgstr "Välj fil att bifoga"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Kommentar"
 msgid "File comment"
 msgstr "Fil kommentar"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr "Ogiltigt val"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Namn"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Serverfel"
 msgid "An error has been logged by the server."
 msgstr "Ett fel har loggats av servern."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Måste vara ett giltigt nummer"
 
@@ -678,7 +678,7 @@ msgstr "URL för fjärrbildsfil"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Nedladdning av bilder från fjärr-URL är inte aktiverad"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Kontroll av bakgrundsarbetare misslyckades"
 
@@ -938,14 +938,14 @@ msgstr "Om InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Byggnationen måste avbrytas innan den kan tas bort"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Byggorderreferens"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Byggorder till vilken detta bygge är tilldelad"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Byggorder till vilken detta bygge är tilldelad"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Byggstatus"
 msgid "Build status code"
 msgstr "Bygg statuskod"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Batchkod"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Byggutgång matchar inte bygg order"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Antal måste vara 1 för serialiserat lager"
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Serienummer"
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Acceptera ofullständig"
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1400 @@ msgstr "Projektbeskrivning"
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Ingen grupp"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Omstart krävs"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Serverinstans (Namn)"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Företagsnamn"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Internt företagsnamn"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "Bas-URL"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "Bas-URL för serverinstans"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Standardvaluta"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "dagar"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Ladda ned från URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Tillåt nedladdning av bilder och filer från extern URL"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Kräv bekräftelse"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Kräv uttrycklig användarbekräftelse för vissa åtgärder."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Stöd för streckkoder"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Mall"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Virtuell"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Delar är virtuella som standard"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Visa import i vyer"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Visa importguiden i vissa delvyer"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Visa relaterade delar"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Visa relaterade delar för en del"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Visningsformat för delnamn"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Formatera för att visa artikelnamnet"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Interna priser"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Aktivera etikettutskrift"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Aktivera etikettutskrift från webbgränssnittet"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "Etikettbild DPI"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Aktivera rapporter"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Aktivera generering av rapporter"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Debugläge"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+#, fuzzy
+#| msgid "No Reports Found"
+msgid "Log Report Errors"
+msgstr "Inga rapporter hittades"
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Sidstorlek"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Standard sidstorlek för PDF-rapporter"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Aktivera testrapporter"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Tillåtna domäner"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr "Aktivera projektkoder"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Sök efter artiklar"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr "Sök efter leverantörsartikel"
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Sök efter tillverkarartikel"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3518,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3544,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3648,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3976,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3987,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4002,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4048,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4074,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4091,7 @@ msgstr "Leverantör"
 msgid "Select supplier"
 msgstr "Välj leverantör"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4108,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4127,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4233,7 @@ msgstr "Radera bild"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4444,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4544,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4594,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4657,7 @@ msgstr "Etikett"
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4683,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4697,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4856,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5047,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5102,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5151,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5225,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Streckkod"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5781,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5803,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5879,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5903,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5991,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6009,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6018,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6100,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,602 +6434,608 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Det finns redan en bilaga med detta filnamn"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Underkategorier"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr "Välj kategori"
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "Extern länk"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 #, fuzzy
 #| msgid "In Stock"
 msgid "Variant Stock"
 msgstr "I lager"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Generera rapport"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8029,7 +8045,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8337,16 +8353,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8366,103 +8382,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Det finns redan en bilaga med detta filnamn"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Det finns redan en bilaga med detta filnamn"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8769,7 +8797,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8814,7 +8842,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8826,7 +8854,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8903,7 +8931,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8935,7 +8963,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8983,184 +9011,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/th/LC_MESSAGES/django.po b/InvenTree/locale/th/LC_MESSAGES/django.po
index f1c5fbb5297f..4e3385978890 100644
--- a/InvenTree/locale/th/LC_MESSAGES/django.po
+++ b/InvenTree/locale/th/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Thai\n"
@@ -30,20 +30,20 @@ msgstr ""
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr ""
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr "ป้อนวันที่"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr ""
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "ปริมาณสินค้าไม่ถูกต้อง"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr ""
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "หมายเลขซีเรียลซ้ำกัน"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "ไม่พบหมายเลขซีเรียล"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr ""
 
@@ -401,7 +401,7 @@ msgstr "ไฟล์แนบ"
 msgid "Select file to attach"
 msgstr "เลือกไฟล์ที่ต้องการแนบ"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "ความคิดเห็น"
 msgid "File comment"
 msgstr "ความเห็นของไฟล์"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr ""
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "ชื่อ"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "เกิดข้อผิดพลาดที่เซิร์ฟเ
 msgid "An error has been logged by the server."
 msgstr ""
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "ต้องเป็นตัวเลข"
 
@@ -678,7 +678,7 @@ msgstr ""
 msgid "Downloading images from remote URL is not enabled"
 msgstr ""
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr ""
 
@@ -938,14 +938,14 @@ msgstr "เกี่ยวกับ Inventree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr ""
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr ""
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr ""
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr ""
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr ""
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr ""
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr ""
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr ""
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,598 +6432,602 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+msgid "Test template with the same key already exists for part"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8037,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8345,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8362,103 +8374,111 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+msgid "Snippet file with this name already exists"
+msgstr ""
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+msgid "Asset file with this name already exists"
+msgstr ""
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8785,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8830,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8822,7 +8842,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8899,7 +8919,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8931,7 +8951,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8979,184 +8999,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/tr/LC_MESSAGES/django.po b/InvenTree/locale/tr/LC_MESSAGES/django.po
index 87aa424aef77..8e0fb5d3e5bb 100644
--- a/InvenTree/locale/tr/LC_MESSAGES/django.po
+++ b/InvenTree/locale/tr/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-03-06 10:36\n"
 "Last-Translator: \n"
 "Language-Team: Turkish\n"
@@ -30,20 +30,20 @@ msgstr "Kullanıcının bu modeli görüntüleme izni yok"
 msgid "Invalid unit provided ({unit})"
 msgstr "Geçersiz ürün girildi ({unit})"
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Değer verilmemiş"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "{original} birimi {unit} birimine dönüştürülemedi"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Geçersiz miktar sağlandı"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Geçersiz miktar sağlandı({exc})"
@@ -65,9 +65,9 @@ msgstr "Tarih giriniz"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Sağlanan e-posta alanı onaylanmadı."
 msgid "Registration is disabled."
 msgstr "Kayıt devre dışı."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Geçersiz veri sağlandı"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Boş seri numarası dizesi"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Yinelenen seri"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Geçersiz grup aralığı: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Grup aralığı {group}, izin verilen miktarı aşmaktadır ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Geçersiz grup aralığı: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Seri numarası bulunamadı"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Benzersiz seri numaralarının sayısı ({len(serials)}) ile miktarın ({expected_quantity}) eşleşmesi gerekmektedir"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Bu değerden HTML etiketlerini kaldır"
 
@@ -401,7 +401,7 @@ msgstr "Ek"
 msgid "Select file to attach"
 msgstr "Eklenecek dosyayı seç"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Yorum"
 msgid "File comment"
 msgstr "Dosya yorumu"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Aynı kaynak altında birden fazla aynı isim kullanılamaz"
 msgid "Invalid choice"
 msgstr "Geçersiz seçim"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Adı"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Sunucu Hatası"
 msgid "An error has been logged by the server."
 msgstr "Bir hafta sunucu tarafından kayıt edildi."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Geçerli bir numara olmalı"
 
@@ -678,7 +678,7 @@ msgstr "Uzaktan görüntü dosya URL'si"
 msgid "Downloading images from remote URL is not enabled"
 msgstr ""
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Arka plan çalışanı kontrolü başarısız oldu"
 
@@ -938,14 +938,14 @@ msgstr "InvenTree Hakkında"
 msgid "Build must be cancelled before it can be deleted"
 msgstr ""
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Yapım İşi Emri Referansı"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Bu yapım işinin tahsis edildiği yapım işi emri"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Bu yapım işinin tahsis edildiği yapım işi emri"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Yapım İşi Durumu"
 msgid "Build status code"
 msgstr "Yapım işi durum kodu"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Sıra numarası"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Yapım işi çıktısı, yapım işi emri ile eşleşmiyor"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr ""
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Seri numaralı stok için miktar bir olmalı"
 msgid "Selected stock item does not match BOM line"
 msgstr ""
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr ""
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr ""
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Seri Numaraları"
@@ -1451,10 +1451,10 @@ msgstr ""
 msgid "A list of build outputs must be provided"
 msgstr ""
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr "Gerekli stok tamamen tahsis edilemedi"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr ""
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr ""
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "Anahtar dizesi benzersiz olmalı"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Şirket adı"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "Ana URL"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Varsayılan Para Birimi"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "günler"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "URL'den indir"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Harici URL'den resim ve dosyaların indirilmesine izin ver"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Barkod Desteği"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "DPN Regex"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Parça DPN eşleştirmesi için Düzenli İfade Kalıbı (Regex)"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Yinelenen DPN'ye İzin Ver"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Birden çok parçanın aynı DPN'yi paylaşmasına izin ver"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "DPN Düzenlemeye İzin Ver"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Parçayı düzenlerken DPN değiştirmeye izin ver"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Kategori Paremetre Sablonu Kopyala"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Parça oluştururken kategori parametre şablonlarını kopyala"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Şablon"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Parçaları varsayılan olan şablondur"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Montaj"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Parçalar varsayılan olarak başka bileşenlerden monte edilebilir"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Bileşen"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Parçalar varsayılan olarak alt bileşen olarak kullanılabilir"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Satın Alınabilir"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Parçalar varsayılan olarak satın alınabilir"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Satılabilir"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Parçalar varsayılan olarak satılabilir"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Takip Edilebilir"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Parçalar varsayılan olarak takip edilebilir"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Sanal"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Parçalar varsayılan olarak sanaldır"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "İlgili parçaları göster"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Hata Ayıklama Modu"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Raporları hata ayıklama modunda üret (HTML çıktısı)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Sayfa Boyutu"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "PDF raporlar için varsayılan sayfa boyutu"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Stok konumu ve ögeler üzerinde sahiplik kontrolünü etkinleştirin"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Formlarda Miktarı Göster"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr "Fiyat"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr "Aktif"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr "Resim"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Temel Parça"
@@ -3977,7 +3985,7 @@ msgstr "Parça seçin"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Üretici seçin"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr "Parametre değeri"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "Tedarikçi"
 msgid "Select supplier"
 msgstr "Tedarikçi seçin"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Not"
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr "Etiket"
 msgid "Label template file"
 msgstr "Etiket şablon listesi"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "Yükseklik [mm]"
 msgid "Label height, specified in mm"
 msgstr "Etiket yüksekliği mm olarak belirtilmeli"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Dosya Adı Deseni"
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Filtreler"
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "Tahsis miktarı stok miktarını aşamaz"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Seri numaralı stok kalemi için miktar bir olmalı"
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr "DPN"
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Revizyon"
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Varsayılan Konum"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Parça adı"
 
@@ -6424,598 +6432,604 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr "Test şablonları sadece takip edilebilir paçalar için oluşturulabilir"
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
-msgstr ""
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "Aynı isimli başka bir dosya zaten var"
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Test Adı"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Test Açıklaması"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Gerekli"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr "Testi geçmesi için bu gerekli mi?"
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr "Parametre şablon adı benzersiz olmalıdır"
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Parametre Şablonu"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr "Bu malzeme listesi, çeşit parçalar listesini kalıtsalıdır"
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Çeşide İzin Ver"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr "Çeşit parçaların stok kalemleri bu malzeme listesinde kullanılabilir"
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Alt kategoriler"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 msgid "External Stock"
 msgstr ""
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 msgid "Unallocated Stock"
 msgstr ""
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8025,7 +8039,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8333,16 +8347,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "Şablon için geçerli bir nesne sağlanmadı"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8362,103 +8376,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Şablon adı"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "Rapor şablon dosyası"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr "Rapor şablon tanımı"
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr "Revizyon numarası raporla (otomatik artış)"
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr "Rapor şablonu etkin"
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr "Stok kalemi sorgu filtreleri (anahter=değer [key=value] olarak virgülle ayrılmış liste)"
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Aynı isimli başka bir dosya zaten var"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Aynı isimli başka bir dosya zaten var"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8765,7 +8791,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8810,7 +8836,7 @@ msgstr "Bu stok kalemi için tedarikçi parçası seçin"
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8822,7 +8848,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr "Bu öge için seri numarası"
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8899,7 +8925,7 @@ msgstr "Seri numaraları tam sayı listesi olmalı"
 msgid "Quantity does not match serial numbers"
 msgstr "Miktar seri numaları ile eşleşmiyor"
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Seri numaraları zaten mevcut"
 
@@ -8931,7 +8957,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8979,184 +9005,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr "İşlem notu ekle (isteğe bağlı)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Alt konumlar"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/vi/LC_MESSAGES/django.po b/InvenTree/locale/vi/LC_MESSAGES/django.po
index 97043eea212f..ae52564d376a 100644
--- a/InvenTree/locale/vi/LC_MESSAGES/django.po
+++ b/InvenTree/locale/vi/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Vietnamese\n"
@@ -30,20 +30,20 @@ msgstr "Người dùng không được phân quyền xem mẫu này"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "Chưa cung cấp giá trị"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr "Không thể chuyển đổi {original} sang {unit}"
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr "Số lượng cung cấp không hợp lệ"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr "Số lượng cung cấp không hợp lệ ({exc})"
@@ -65,9 +65,9 @@ msgstr "Nhập ngày"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "Miền email được cung cấp không được phê duyệt."
 msgid "Registration is disabled."
 msgstr "Đăng ký bị vô hiệu hóa."
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "Số lượng cung cấp không hợp lệ"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "Chuỗi số sê-ri trống"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "Trùng lặp sê-ri"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr "Phạm vi nhóm không hợp lệ: {group}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "Khoảng nhóm {group} vượt cho phép số lượng ({expected_quantity})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr "Thứ tự nhóm không hợp lệ: {group}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "Không tìm thấy số sê-ri"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "Số sê ri duy nhất ({len(serials)}) phải phù hợp số lượng ({expected_quantity})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "Xóa thẻ HTML từ giá trị này"
 
@@ -401,7 +401,7 @@ msgstr "Đính kèm"
 msgid "Select file to attach"
 msgstr "Chọn file đính kèm"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "Bình luận"
 msgid "File comment"
 msgstr "Bình luận tệp tin"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "Tên trùng lặp không thể tồn tại trong cùng cấp thư mục"
 msgid "Invalid choice"
 msgstr "Lựa chọn sai"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "Tên"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "Lỗi máy chủ"
 msgid "An error has been logged by the server."
 msgstr "Lỗi đã được ghi lại bởi máy chủ."
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "Phải là một số hợp lệ"
 
@@ -678,7 +678,7 @@ msgstr "URL của tệp hình ảnh bên ngoài"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "Chức năng tải hình ảnh từ URL bên ngoài không được bật"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "Nhân công chạy ngầm kiểm tra thất bại"
 
@@ -938,14 +938,14 @@ msgstr "Giới thiệu"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "Bạn dựng phải được hủy bỏ trước khi có thể xóa được"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "Vật tư tiêu hao"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "Tham chiếu đơn đặt bản dựng"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "Đơn đặt bản dựng với bản dựng này đã được phân b
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "Đơn đặt bản dựng với bản dựng này đã được phân b
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "Trnạg thái bản dựng"
 msgid "Build status code"
 msgstr "Mã trạng thái bản dựng"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "Mã lô hàng"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "Đầu ra bản dựng không phù hợp với đơn đặt bản dựng"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "Số lượng phải lớn hơn 0"
 
@@ -1285,10 +1285,10 @@ msgstr "Dựng đối tượng"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr "Dựng đối tượng"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "Số lượng phải là 1 cho kho sê ri"
 msgid "Selected stock item does not match BOM line"
 msgstr "Hàng trong kho đã chọn không phù hợp với đường BOM"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "Số lượng nguyên dương cần phải điền cho sản phẩm có
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "Cần nhập số lượng nguyên dương, bởi vì hóa đơn vật liệu chứa sản phẩm có thể theo dõi"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "Số sê-ri"
@@ -1451,10 +1451,10 @@ msgstr "Số sêri sau đây đã tồn tại hoặc không hợp lệ"
 msgid "A list of build outputs must be provided"
 msgstr "Danh sách đầu ra bản dựng phải được cung cấp"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr "Vị trí cho đầu ra bản dựng hoàn thiện"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr "Chấp nhận hàng hóa không được phân bổ đầy đủ vào đ
 msgid "Required stock has not been fully allocated"
 msgstr "Kho được yêu cầu chưa được phân bổ hết không gian"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "Chấp nhận không hoàn thành"
 
@@ -1602,11 +1602,11 @@ msgstr "Mục chi tiết bản dựng"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part phải trỏ đến phần tương tự của đơn đặt bản dựng"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "Hàng hóa phải trong kho"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "Số lượng có sẵn ({q}) đã bị vượt quá"
@@ -1619,7 +1619,7 @@ msgstr "Đầu ra bản dựng phải được xác định cho việc phân s
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "Đầu ra bản dựng không thể chỉ định cho việc phân sản phẩm chưa được theo dõi"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "Hàng hóa phân bổ phải được cung cấp"
 
@@ -1659,7 +1659,7 @@ msgstr "Mục tùy chọn"
 msgid "Allocate optional BOM items to build order"
 msgstr "Phân bổ các mục hóa đơn vật liệu tùy chọn đến đơn đặt bản dựng"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "Mục BOM"
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr "Bật đơn hàng"
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr "Đang sản xuất"
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr "Mô tả dự án"
 msgid "User or group responsible for this project"
 msgstr "Người dùng hoặc nhóm có trách nhiệm với dự án này"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "Khóa thiết lập (phải duy nhất - phân biệt hoa thường)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "Giá trị cài đặt"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "Giá trị đã chọn không hợp lệ"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "Giá trị phải là kiểu boolean"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "Giá trị phải là một số nguyên dương"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "Chuỗi khóa phải duy nhất"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "Không có nhóm"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "Tên miền rỗng là không được phép."
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "Tên miền không hợp lệ: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr "Không phần mở rộng"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "Cần khởi động lại"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "Một thiết lập đã bị thay đổi yêu cầu khởi động lại máy chủ"
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr "Chuyển dữ liệu chờ xử lý"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr "Số đợt nâng cấp cơ sở dữ liệu chờ xử lý"
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "Tên thực thể máy chủ"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr "Mô tả chuỗi cho thực thể máy chủ"
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr "Sử dụng tên thực thể"
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr "Sử dụng tên thực thể trên thanh tiêu đề"
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr "Cấm hiển thị `giới thiệu`"
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr "Chỉ hiển thị cửa sổ `giới thiệu` với siêu người dùng"
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "Tên công ty"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "Tên công ty nội bộ"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr "URL cơ sở"
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr "URL cơ sở cho thực thể máy chủ"
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr "Tiền tệ mặc định"
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr "Chọn tiền tệ chính khi tính giá"
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr "Tần suất cập nhật tiền tệ"
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr "Mức độ thường xuyên để cập nhật tỉ giá hối đoái (điền 0 để tắt)"
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "ngày"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr "Phần mở rộng cập nhật tiền tệ"
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr "Phần mở rộng cập nhật tiền tệ được sử dụng"
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr "Tải về từ URL"
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr "Cho phép tải ảnh và tệp tin từ xa theo URL bên ngoài"
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr "Giới hạn kích thước tải xuống"
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr "Kích thước tải xuống tối đa với hình ảnh từ xa"
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr "User-agent được dùng để tải xuống theo URL"
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr "Cho phép ghi đè user-agent được dùng để tải về hình ảnh và tệp tin từ xa theo URL bên ngoài (để trống nghĩa là dùng mặc định)"
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr "Yêu cầu xác nhận"
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr "Yêu cầu người dùng xác nhận rõ ràng với một số chức năng nhất định."
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr "Cấp độ cây"
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr "Độ sâu cây mặc định cho màn hình cây. Cấp độ sâu hơn sẽ sử dụng kỹ thuật tải chậm nếu cần thiết."
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr "Thời gian kiểm tra bản cập nhật"
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr "Mức độ thường xuyên để kiểm tra bản cập nhật (điền 0 để tắt)"
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "Sao lưu tự động"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "Bật tính năng sao lưu tự động cơ sở dữ liệu và tệp tin đa phương tiện"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "Khoảng thời gian sao lưu tự động"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr "Xác định số ngày giữa các kỳ sao lưu tự động"
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr "Khoảng thời gian xóa tác vụ"
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr "Kết quả tác vụ chạy ngầm sẽ bị xóa sau số ngày được chỉ định"
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr "Khoảng thời gian xóa nhật ký lỗi"
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr "Nhật ký lỗi sẽ bị xóa sau số ngày được chỉ định"
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr "Khoảng thời gian xóa thông báo"
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr "Thông báo sẽ bị xóa sau số ngày được chỉ định"
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr "Hỗ trợ mã vạch"
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr "Bật hỗ trợ máy quét mã vạch trong giao diện web"
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr "Độ trễ quét mã vạch"
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr "Thời gian trễ xử lý đầu đọc mã vạch"
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr "Hỗ trợ mã vạch qua webcam"
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr "Cho phép quét mã vạch qua webcam bên trong trình duyệt"
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr "Phiên bản Sản phẩm"
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr "Bật trường phiên bản cho sản phẩm"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr "Mẫu IPN"
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr "Mẫu dùng nhanh phổ biến dành cho tìm IPN sản phẩm"
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr "Cho phép trùng IPN"
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr "Cho phép nhiều sản phẩm dùng IPN giống nhau"
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr "Cho phép sửa IPN"
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr "Cho phép đổi giá trị IPN khi sửa một sản phẩm"
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr "Sao chép dữ liệu BOM của sản phẩm"
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr "Sao chép dữ liệu BOM mặc định khi nhân bản 1 sản phẩm"
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr "Sao chép dữ liệu tham số sản phẩm"
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr "Sao chép dữ liệu tham số mặc định khi nhân bản 1 sản phẩm"
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr "Chép thông tin kiểm thử sản phẩm"
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr "Sao chép dữ liệu kiểm thử mặc định khi nhân bản 1 sản phẩm"
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr "Sao chéo mẫu tham số danh mục"
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr "Sao chéo mẫu tham số danh mục khi tạo 1 sản phẩm"
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "Mẫu"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr "Sản phẩm là mẫu bởi mặc định"
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "Lắp ráp"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr "Sản phẩm có thể lắp giáp từ thành phần khác theo mặc định"
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "Thành phần"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr "Sản phẩm có thể được sử dụng mặc định như thành phần phụ"
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "Có thể mua"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "Sản phẩm mặc định có thể mua được"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "Có thể bán"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "Sản phẩm mặc định có thể bán được"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "Có thể theo dõi"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "Sản phẩm mặc định có thể theo dõi được"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "Ảo"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "Sản phẩm mặc định là số hóa"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "Hiển thị Nhập liệu trong khung xem"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "Hiển thị đồ thuật nhập dữ liệu trong một số khung nhìn sản phẩm"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "Hiển thị sản phẩm liên quan"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr "Hiện sản phẩm liên quan cho 1 sản phẩm"
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr "Số liệu tồn kho ban đầu"
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr "Cho phép tạo tồn kho ban đầu khi thêm 1 sản phẩm mới"
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr "Dữ liệu nhà cung cấp ban đầu"
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr "Cho phép tạo dữ liệu nhà cung cấp ban đầu khi thêm 1 sản phẩm mới"
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr "Định dạng tên sản phẩm hiển thị"
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr "Định dạng để hiển thị tên sản phẩm"
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr "Biểu tượng mặc định của danh mục sản phẩm"
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr "Biểu tượng mặc định của danh mục sản phẩm (để trống nghĩa là không có biểu tượng)"
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr "Bắt buộc đơn vị tham số"
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr "Nếu đơn vị được cung cấp, giá trị tham số phải phù hợp với các đơn vị xác định"
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr "Vị trí phần thập phân giá bán tối thiểu"
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr "Số vị trí thập phân tối thiểu cần hiển thị khi tạo dữ liệu giá"
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr "Vị trí phần thập phân giá bán tối đa"
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr "Số vị trí thập phân tối đa cần hiển thị khi tạo dữ liệu giá"
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr "Sử dụng giá bán nhà cung cấp"
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr "Bao gồm giá phá vỡ cả nhà cung cấp trong tính toán giá tổng thể"
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr "Ghi đè lịch sử mua hàng"
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr "Giá đơn hàng đặt mua trước đó ghi đè giá phá vỡ của nhà cung cấp"
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr "Sử dụng giá hàng hóa trong kho"
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr "Dùng giá bán từ dữ liệu kho nhập vào thủ công đối với bộ tính toán giá bán"
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr "Tuổi giá kho hàng"
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr "Loại trừ hàng hóa trong kho cũ hơn số ngày ngày từ bảng tính giá bán"
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr "Sử dụng giá biến thể"
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr "Bao gồm giá biến thể trong bộ tính toán giá tổng thể"
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr "Chỉ các biến thể hoạt động"
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr "Chỉ sử dụng sản phẩm biến thể hoạt động để tính toán giá bán biến thể"
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr "Tần suất tạo lại giá"
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr "Số ngày trước khi giá sản phẩm được tự động cập nhật"
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "Giá nội bộ"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "Bật giá nội bộ cho sản phẩm"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr "Ghi đè giá nội bộ"
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr "Nếu khả dụng, giá nội bộ ghi đè tính toán khoảng giá"
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr "Bật in tem nhãn"
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr "Bật chức năng in tem nhãn từ giao diện web"
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr "DPI hỉnh ảnh tem nhãn"
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr "Độ phân giải DPI khi tạo tệp hình ảnh để cung cấp cho plugin in ấn tem nhãn"
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr "Bật báo cáo"
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr "Cho phép tạo báo cáo"
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "Chế độ gỡ lỗi"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "Tạo báo cáo trong chế độ gỡ lỗi (đầu ra HTML)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "Khổ giấy"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "Kích thước trang mặc định cho báo cáo PDF"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr "Bật báo cáo kiểm thử"
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "Cho phép tạo báo cáo kiểm thử"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr "Đính kèm báo cáo kiểm thử"
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr "Khi in một báo cáo kiểm thử, đính kèm một bản sao của báo cáo kiểm thử với hàng trong kho đã được kết hợp"
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr "Sê ri toàn cục duy nhất"
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr "Số sê ri cho hàng trong kho phải là duy nhất trong toàn hệ thống"
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr "Tự động điền số sê ri"
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr "Tự động điền số sê ri vào biểu mẫu"
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr "Xóa kho đã hết hàng"
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr "Nhận dạng hành vi mặc định khi hàng trong kho bị hết"
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr "Mẫu sinh mã theo lô"
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr "Mẫu tạo mã theo lô mặc định cho hàng trong kho"
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "Quá hạn trong kho"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "Bật chức năng quá hạn tồn kho"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "Bán kho quá hạn"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "Cho phép bán hàng kho quá hạn"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr "Thời gian hàng cũ trong kho"
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr "Số ngày hàng trong kho được xác định là cũ trước khi quá hạn"
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr "Dựng kho quá hạn"
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr "Cho phép xây dựng với kho hàng quá hạn"
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "Kiểm soát sở hữu kho"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr "Bật chức năng kiểm soát sở hữu kho với địa điểm và hàng trong kho"
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr "Biểu tượng địa điểm kho mặc định"
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr "Biểu tượng địa điểm kho hàng mặc định (trống nghĩa là không có biểu tượng)"
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr "Hiển thị hàng hóa đã lắp đặt"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr "Hiển thị hàng trong kho đã được lắp đặt trên bảng kho"
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr "Mã tham chiếu đơn đặt bản dựng"
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr "Mẫu bắt buộc cho để trường tham chiếu đơn đặt bản dựng"
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr "Bật đơn hàng trả lại"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr "Bật chức năng đơn hàng trả lại trong giao diện người dùng"
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr "Mẫu tham chiếu đơn hàng trả lại"
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr "Mẫu bắt buộc để tạo trường tham chiếu đơn hàng trả lại"
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr "Sửa đơn hàng trả lại đã hoàn thành"
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr "Cho phép sửa đơn hàng trả lại sau khi đã hoàn thành rồi"
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr "Mẫu tham chiếu đơn đặt hàng"
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr "Mẫu bắt buộc để tạo trường tham chiếu đơn đặt hàng"
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr "Vận chuyển mặc định đơn đặt hàng"
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr "Cho phép tạo vận chuyển mặc định với đơn đặt hàng"
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr "Sửa đơn đặt hàng đã hoàn thành"
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr "Cho phép sửa đơn đặt hàng sau khi đã vận chuyển hoặc hoàn thành"
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr "Mẫu tham chiếu đơn đặt mua"
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr "Mẫu bắt buộc cho để trường tham chiếu đơn đặt mua"
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr "Sửa đơn đặt mua đã hoàn thành"
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr "Cho phép sửa đơn đặt mua sau khi đã vận chuyển hoặc hoàn thành"
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr "Tự động hoàn thành đơn đặt mua"
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr "Bật quên mật khẩu"
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr "Bật chức năng quên mật khẩu trong trang đăng nhập"
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr "Bật đăng ký"
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr "Cho phép người dùng tự đăng ký tại trang đăng nhập"
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr "Bật SSO"
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr "Cho phép SSO tại trang đăng nhập"
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr "Bật đăng ký SSO"
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr "Cho phép người dùng tự đăng ký SSO tại trang đăng nhập"
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr "Yêu cầu email"
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr "Yêu cầu người dùng cung cấp email để đăng ký"
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr "Người dùng tự động điền SSO"
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr "Tự động điền thông tin chi tiết từ dữ liệu tài khoản SSO"
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr "Thư 2 lần"
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr "Khi đăng ký sẽ hỏi người dùng hai lần thư điện tử của họ"
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr "Mật khẩu 2 lần"
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr "Khi đăng ký sẽ hỏi người dùng hai lần mật khẩu của họ"
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr "Các tên miền được phép"
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr "Cấm đăng ký với 1 số tên miền cụ thể (dấu phẩy ngăn cách, bắt đầu với dấu @)"
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr "Nhóm khi đăng ký"
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr "Nhóm được gán cho người dùng mới khi đăng ký"
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr "Bắt buộc MFA"
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr "Người dùng phải sử dụng bảo mật đa nhân tố."
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr "Kiểm tra phần mở rộng khi khởi động"
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr "Kiểm tra toàn bộ phần mở rộng đã được cài đặt khi khởi dộng - bật trong môi trường ảo hóa"
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr "Kiểm tra cập nhật plugin"
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr "Bật tích hợp URL"
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr "Bật phần mở rộng để thêm định tuyến URL"
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr "Bật tích hợp điều hướng"
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr "Bật phần mở rộng để tích hợp thanh định hướng"
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr "Bật tích hợp ứng dụng"
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr "Bật phần mở rộng để thêm ứng dụng"
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr "Cho phép tích hợp lập lịch"
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr "Bật phẩn mở rộng để chạy các tác vụ theo lịch"
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr "Bật tích hợp nguồn cấp sự kiện"
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr "Bật phần mở rộng để trả lời sự kiện bên trong"
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr "Bật mã dự án"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr "Bật mã dự án để theo dõi dự án"
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr "Chức năng kiểm kê"
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr "Bật chức năng kiểm kê theo mức độ ghi nhận kho và tính toán giá trị kho"
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr "Ngoại trừ vị trí bên ngoài"
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr "Loại trừ hàng trong kho thuộc địa điểm bên ngoài ra khỏi tính toán kiểm kê"
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr "Giai đoạn kiểm kê tự động"
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr "Số ngày giữa ghi chép kiểm kê tự động (đặt không để tắt)"
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr "Khoảng thời gian xóa báo cáo"
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr "Báo cáo kiểm kê sẽ bị xóa sau số ngày xác định"
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr "Hiển thị tên đầy đủ của người dùng"
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr "Hiển thị tên đầy đủ thay vì tên đăng nhập"
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr "Khóa thiết lập (phải duy nhất - phân biệt hoa thường"
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr "Ẩn sản phẩm ngừng hoạt động"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr "Ẩn sản phẩm bị tắt trong kết quả trình bày tại trang chủ"
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr "Hiện sản phẩm đã đăng ký"
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr "Hiện sản phẩm đã đăng ký trên trang chủ"
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr "Hiện danh mục đã đăng ký"
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr "Hiện danh mục sản phẩm đã đăng ký trên trang chủ"
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "Hiển thị nguyên liệu mới nhất"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "Hiển thị nguyên liệu mới nhất trên trang chủ"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr "Hiển thị BOM chưa được xác thực"
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr "Hiện BOM chờ xác thực tại trang chủ"
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr "Hiện thay đổi kho hàng gần đây"
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr "Hiện hàng trong kho được thay đổi gần nhất trên trang chủ"
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr "Hiển thị hàng còn ít"
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr "Hiển thị hàng hóa còn ít tại trang chủ"
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr "Hiển thị hết hàng"
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr "Hiển thị hàng hóa đã bán hết tại trang chủ"
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr "Hiển thị hàng cần thiết"
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr "Hiện hàng trong kho cần thiết cho xây dựng tại trang chủ"
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr "Bán kho quá hạn"
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr "Hiển thị hàng hóa đã quá hạn trên trang chủ"
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr "Hiện kho hàng ế"
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr "Hiện hàng trong kho bị ế trên trang chủ"
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr "Hiện bản dựng chờ xử lý"
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr "Hiện bản dựng chờ xử lý trên trang chủ"
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "Hiện bản dựng quá hạn"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "Hiện bản dựng quá hạn trên trang chủ"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr "Hiện PO nổi bật"
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr "Hiện PO nổi bật trên trang chủ"
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr "Hiện PO quá hạn"
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr "Hiện đơn mua hàng quá hạn trên trang chủ"
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr "Hiện đơn hàng vận chuyển nổi bật"
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr "Hiện đơn hàng vận chuyển nổi bật tại trang chủ"
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr "Hiện đơn vận chuyển quá hạn"
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr "Hiện đơn vận chuyển quá hạn trên trang chủ"
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr "Hiện đơn vận chuyển chờ xử lý"
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr "Hiện đơn vận chuyển chờ xử lý trên trang chủ"
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr "Hiện tin tức"
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr "Hiện tin tức trên trang chủ"
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "Hiển thị nhãn cùng dòng"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "Hiển thị nhãn PDF trong trình duyệt, thay vì tải về dạng tệp tin"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr "Máy in tem nhãn mặc định"
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr "Cấu hình máy in tem nhãn nào được chọn mặc định"
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr "Hiển thị báo cáo cùng hàng"
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "Hiện báo cáo PDF trong trình duyệt, thay vì tải về dạng tệp tin"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr "Tìm sản phẩm"
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr "Hiện hàng hóa trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr "Tìm sản phẩm nhà cung cấp"
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr "Hiện sản phẩm nhà cung cấp trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr "Tìm sản phẩm nhà sản xuất"
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr "Hiện sản phẩm nhà sản xuất trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr "Ẩn sản phẩm ngừng hoạt động"
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr "Loại trừ sản phẩm ngưng hoạt động trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr "Tìm kiếm danh mục"
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr "Hiện danh mục sản phẩm trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr "Tìm kiếm kho"
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr "Hiện hàng hóa ở kho trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr "Ẩn hàng hóa trong kho không có sẵn"
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr "Không bao gồm hàng hóa trong kho mà không sẵn sàng từ màn hình xem trước tìm kiếm"
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr "Tìm kiếm vị trí"
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr "Hiện vị trí kho hàng trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr "Tìm kiếm công ty"
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr "Hiện công ty trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr "Tìm kiếm đặt hàng xây dựng"
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr "Hiện đơn đặt xây dựng trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr "Tìm kiếm đơn đặt mua"
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr "Hiện đơn đặt mua trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr "Loại trừ đơn đặt mua không hoạt động"
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr "Loại trừ đơn đặt mua không hoạt động ra khỏi cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr "Tìm đơn đặt hàng người mua"
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr "Hiện đơn đặt hàng người mua trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr "Loại trừ đơn đặt hàng người mua không hoạt động"
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr "Không bao gồm đơn đặt hàng người mua không hoạt động trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr "Tìm kiếm đơn hàng trả lại"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr "Hiện đơn hàng trả lại trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr "Loại trừ đơn hàng trả lại không hoạt động"
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr "Không bao gồm đơn hàng trả lại không hoạt động trong cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "Kết quả xem trước tìm kiếm"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr "Số kết quả cần hiển thị trong từng phần của cửa sổ xem trước tìm kiếm"
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr "Tìm kiếm biểu thức"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr "Bật tìm kiếm biểu thức chính quy trong câu truy vấn tìm kiếm"
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr "Tìm phù hợp toàn bộ chữ"
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr "Truy vấn tìm trả về kết quả phù hợp toàn bộ chữ"
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "Hiện số lượng trong biểu mẫu"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "Hiển thị số lượng sản phẩm có sẵn trong một số biểu mẫu"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr "Phím escape để đóng mẫu biểu"
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr "Sử dụng phím escape để đóng mẫu biểu hộp thoại"
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr "Cố định điều hướng"
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr "Vị trí thành điều hướng là cố định trên cùng màn hình"
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr "Định dạng ngày"
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr "Định dạng ưa chuộng khi hiển thị ngày"
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr "Lập lịch sản phẩm"
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr "Hiển thị thông tin lịch sản phẩm"
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr "Kiểm kê sản phẩm"
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr "Hiển thị thông tin kiểm kê sản phẩm (nếu chức năng kiểm kê được bật)"
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr "Độ dài chuỗi trong bảng"
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr "Giới hạn độ dài tối đa cho chuỗi hiển thị trong kiểu xem bảng biểu"
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr "Mẫu nhãn sản phẩm mặc định"
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr "Mẫu nhãn sản phẩm mặc định được chọn tự động"
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr "Mẫu hàng hóa trong khi mặc định"
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr "Mẫu nhãn hàng hóa trong kho tự động được chọn"
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr "Mẫu nhãn vị trí kho mặc định"
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr "Mẫu nhãn vị trí kho được chọn tự động"
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr "Nhận báo cáo lỗi"
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr "Nhận thông báo khi có lỗi hệ thống"
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr "Số lượng giá phá vỡ"
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr "Số lượng giá phá vỡ"
 msgid "Price"
 msgstr "Giá"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr "Đơn vị giá theo số lượng cụ thể"
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr "Đầu mối"
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr "Đầu mối tại điểm webhook được nhận"
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr "Tên của webhook này"
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr "Tên của webhook này"
 msgid "Active"
 msgstr "Hoạt động"
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr "Webhook có hoạt động không"
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "Chữ ký số"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr "Chữ ký số để truy cập"
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr "Bí mật"
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr "Mã bí mật dùng chung cho HMAC"
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr "Mã Tin nhắn"
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr "Định danh duy nhất cho tin nhắn này"
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr "Máy chủ"
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr "Mãy chủ từ tin nhắn này đã được nhận"
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr "Đầu mục"
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr "Đầu mục tin nhắn"
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr "Thân"
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr "Thân tin nhắn này"
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr "Đầu mối của tin nhắn này đã nhận được"
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr "Làm việc vào"
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr "Công việc trong tin nhắn này đã kết thúc?"
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr "Mã"
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr "Tiêu đề"
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr "Đã công bố"
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr "Tác giả"
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr "Tóm tắt"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr "Đọc"
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr "Tin này đã được đọc?"
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr "Tin này đã được đọc?"
 msgid "Image"
 msgstr "Hình ảnh"
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr "Tệp ảnh"
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr "Tên đơn vị phải là một định danh hợp lệ"
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr "Tên đơn vị"
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr "Biểu tượng"
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr "Biểu tượng đơn vị tùy chọn"
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr "Định nghĩa"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr "Định nghĩa đơn vị"
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr "Liên kết thông tin địa chỉ (bên ngoài)"
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr "Sản phẩm cơ bản"
@@ -3977,7 +3985,7 @@ msgstr "Chọn sản phẩm"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr "Chọn nhà sản xuất"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr "Giá trị tham số"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr "Sản phẩm nhà sản xuất đã liên kết phải tham chiếu vớ
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr "Nhà cung cấp"
 msgid "Select supplier"
 msgstr "Chọn nhà cung cấp"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr "Đơn vị quản lý kho nhà cung cấp"
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr "Mô tả sản phẩm nhà cung cấp"
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "Ghi chú"
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Thu phí tối thiểu (vd: phí kho bãi)"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr "Xóa ảnh"
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr "Chưa có thông tin nhà sản xuất"
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr "Chưa có thông tin nhà cung cấp"
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr "Cập nhật độ sẵn sàng sản phẩm"
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr "Nhãn"
 msgid "Label template file"
 msgstr "Tệp mẫu nhãn"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr "Chiều cao [mm]"
 msgid "Label height, specified in mm"
 msgstr "Chiều cao nhãn, tính theo mm"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "Mẫu tên tệp"
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr "Truy vấn bộ lọc (dùng dấu phẩy ngăn cách các cặp key=value)"
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "Bộ lọc"
 
@@ -4846,11 +4854,11 @@ msgstr "Đơn hàng trả lại"
 msgid "Total price for this order"
 msgstr "Tổng tiền cho đơn hàng hàng"
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr "Tiền tệ đơn đặt hàng"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr "Tiền tệ cho đơn đặt này (để trống để sử dụng tiền mặc định)"
 
@@ -5037,7 +5045,7 @@ msgstr "Đã nhận"
 msgid "Number of items received"
 msgstr "Số mục đã nhận"
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr "Kiểm tra bởi"
 msgid "User who checked this shipment"
 msgstr "Người dùng đã kiểm tra vận chuyển này"
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr "Vận chuyển"
 
@@ -5141,7 +5149,7 @@ msgstr "Không thể phân bổ hàng hóa vào một dòng mà không có sản
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "Số lượng phân bổ không thể vượt quá số lượng của kho"
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Số lượng phải là 1 cho hàng hóa sêri"
 
@@ -5215,159 +5223,159 @@ msgstr "Kết quả cho hàng hóa dòng này"
 msgid "Cost associated with return or repair for this line item"
 msgstr "Chi phí gắn với hàng trả lại hoặc sửa chữa cho dòng hàng hóa này"
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "Đơn đặt không thể bị hủy"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr "Cho phép đơn đặt phải đóng lại cùng với các mục dòng hàng hóa chưa hoàn thành"
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr "Đơn đặt có dòng hàng hóa chưa hoàn thành"
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr "Đơn đặt là không được mở"
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr "Tiền tệ giá mua"
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr "Sản phẩm nhà cung cấp phải được chỉ định"
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr "Đơn đặt mua phải được chỉ định"
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr "Nhà cung cấp phải phù hợp với đơn đặt mua"
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr "Đơn đặt mua phải phù hợp với nhà cung cấp"
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr "Mục dòng"
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr "Mục dòng không phù hợp với đơn đặt mua"
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr "Chọn vị trí đích cho hàng hóa đã nhận"
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr "Nhập mã lô cho hàng trong kho đang đến"
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr "Nhập số sê ri cho hàng trong kho đang đến"
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "Mã vạch"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr "Mã vạch đã quét"
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr "Mã vạch đã được dùng"
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr "Cần điền số nguyên cho sản phẩm có thể theo dõi"
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr "Dòng hàng hóa phải được cung cấp"
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr "Vị trí đích phải được chỉ ra"
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr "Giá trị mã vạch đã cung cấp phải duy nhất"
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr "Tiền tệ giá bán"
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr "Chưa cung cấp thông tin vận chuyển"
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr "Dòng hàng hóa chưa được gắn với đơn đặt này"
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr "Số lượng phải là số dương"
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr "Nhập số sê ri để phân bổ"
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr "Vận đơn đã được chuyển đi"
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr "Vận đơn không được gắn với đơn đặt này"
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr "Không tìm thấy số sê ri sau đây"
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr "Những số sê ri sau đây đã được phân bổ"
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr "Dòng riêng biệt đơn hàng trả lại"
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr "Line item không phù hợp với đơn hàng trả lại"
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr "Line item đã nhận được"
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr "Hàng hóa chỉ có thể được nhận theo đơn hàng đang trong tiến trình"
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr "Tiền tệ giá đồng hạng"
 
@@ -5771,12 +5779,12 @@ msgstr "Cập nhật {part} giá đơn vị đến {price}"
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr "Cập nhật {part} giá đơn vị đến {price} và số lượng đến {qty}"
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "ID sản phẩm"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr "Tên sản phẩm"
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr "IPN"
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr "Phiên bản"
@@ -5869,8 +5877,8 @@ msgstr "Tên cha"
 msgid "Category Path"
 msgstr "Đưỡng dẫn danh mục"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr "ID hàng hóa BOM"
 msgid "Parent IPN"
 msgstr "IPN cha"
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr "IPN sản phẩm"
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr "Giá thấp nhất"
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr "Xác minh toàn bộ hóa đơn vật liệu"
 msgid "This option must be selected"
 msgstr "Tùy chọn này phải được chọn"
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "Điểm bán mặc định"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr "Tổng số lượng"
@@ -6008,7 +6016,7 @@ msgstr "Tổng số lượng"
 msgid "Input quantity for price calculation"
 msgstr "Số lượng đầu ra cho tính toán giá bán"
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "Danh mục sản phẩm"
@@ -6090,7 +6098,7 @@ msgstr "Sản phẩm với Tên, IPN và Duyệt lại đã tồn tại."
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr "Sản phẩm không thể được phân vào danh mục sản phẩm có cấu trúc!"
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "Tên sản phẩm"
 
@@ -6424,604 +6432,610 @@ msgstr "Số sản phẩm đã được bao quát bởi kiểm kê"
 msgid "User who requested this stocktake report"
 msgstr "Người dùng đã yêu cầu báo cáo kiểm kê này"
 
-#: part/models.py:3438
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
+msgstr ""
+
+#: part/models.py:3445
 msgid "Test templates can only be created for trackable parts"
 msgstr "Chỉ có thể tạo mẫu kiểm thử cho sản phẩm có thể theo dõi"
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Test with this name already exists for this part"
+msgid "Test template with the same key already exists for part"
 msgstr "Kiểm thử với tên này đã tồn tại cho sản phẩm này"
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr "Tên kiểm thử"
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr "Nhập tên cho kiểm thử"
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr "Mô tả kiểm thử"
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr "Nhập mô tả cho kiểm thử này"
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr "Bắt buộc"
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr "Kiểm thử này bắt buộc phải đạt?"
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr "Giá trị bắt buộc"
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr "Kiểm thử này yêu cầu 1 giá trị khi thêm một kết quả kiểm thử?"
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr "Yêu cầu đính kèm"
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr "Kiểm thử này yêu cầu tệp đính kèm khi thêm một kết quả kiểm thử?"
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr "Tham số hộp kiểm tra không thể có đơn vị"
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr "Tham số hộp kiểm tra không thể có lựa chọn"
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr "Lựa chọn phải duy nhất"
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr "Tên tham số mẫu phải là duy nhất"
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr "Tên tham số"
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr "Đơn vị vật lý cho tham số này"
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr "Mô tả tham số"
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr "Ô lựa chọn"
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr "Tham số này có phải là hộp kiểm tra?"
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr "Lựa chọn"
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr "Lựa chọn hợp lệ từ tham số này (ngăn cách bằng dấu phẩy)"
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr "Lựa chọn sai cho giá trị tham số"
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr "Sản phẩm cha"
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "Mẫu tham số"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr "Dữ liệu"
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr "Giá trị tham số"
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "Giá trị mặc định"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr "Giá trị tham số mặc định"
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr "Tên hoặc mã sản phẩm"
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr "Giá trị mã sản phẩm duy nhất"
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr "Giá trị IPN sản phẩm"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr "Cấp độ"
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr "Cấp độ BOM"
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr "Chọn sản phẩm cha"
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr "Sản phẩm phụ"
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr "Chọn sản phẩm được dùng trong BOM"
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr "Số lượng BOM cho mục BOM này"
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr "Mục BOM này là tùy chọn"
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr "Mục BOM này bị tiêu hao (không được theo dõi trong đơn đặt bản dựng)"
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr "Dư thừa"
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Số lượng bản dựng lãng phí ước tính (tuyệt đối hoặc phần trăm)"
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr "Tham chiếu mục BOM"
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr "Ghi chú mục BOM"
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr "Giá trị tổng kiểm"
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr "Giá trị tổng kiểm dòng BOM"
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr "Đã xác minh"
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr "Mục BOM này là hợp lệ"
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr "Nhận thừa hưởng"
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr "Mục BOM này được thừa kế bởi BOM cho sản phẩm biến thể"
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr "Cho phép biến thể"
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr "Hàng trong kho cho sản phẩm biến thể có thể được dùng bởi mục BOM này"
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr "Số lượng phải là giá trị nguyên dùng cho sản phẩm có thể theo dõi được"
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr "Sản phẩm phụ phải được chỉ định"
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr "Sảm phẩm thay thế mục BOM"
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr "Sản phẩm thay thế không thể giống sản phẩm chủ đạo"
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr "Hàng hóa BOM cha"
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr "Sản phẩm thay thế"
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr "Sản phẩm 1"
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr "Sản phẩm 2"
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr "Chọn sản phẩm liên quan"
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr "Không thể tạo mối quan hệ giữa một sản phẩm và chính nó"
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr "Đã tồn tại mối quan hệ trùng lặp"
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "Phụ mục"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr "Loại tiền mua hàng của hàng hóa này"
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr "Chưa chọn sản phẩm"
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr "Chọn danh mục"
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr "Sản phẩm gốc"
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr "Chọn sản phẩm gốc để nhân bản"
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr "Sao chép ảnh"
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr "Sao chép hình ảnh từ sản phẩm gốc"
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr "Sao chép BOM"
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr "Sao chép định mức nguyên vật liệu từ sản phẩm gốc"
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr "Sao chép thông số"
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr "Sao chép thông tin tham số từ sản phẩm gốc"
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr "Sao chép ghi chú"
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr "Sao chép ghi chú từ sản phẩm gốc"
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr "Số liệu tồn kho ban đầu"
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr "Chỉ ra số lượng tồn kho ban đầu cho sản phẩm. Nếu điền là không, không thêm kho nào."
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr "Vị trí kho ban đầu"
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr "Chỉ định vị trí kho ban đầu cho sản phẩm này"
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr "Chọn nhà cung cấp (hoặc để trống để bỏ qua)"
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr "Chọn nhà sản xuất (hoặc để trống để bỏ qua)"
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr "Mã số nhà sản xuất"
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr "Công ty đã chọn không phải là nhà cung ứng hợp lệ"
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr "Công ty đã chọn không phải là nhà sản xuất hợp lệ"
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr "Mã số nhà sản xuất khớp với MPN này đã tồn tại"
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr "Mã số nhà cung cấp khớp với SKU này đã tồn tại"
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "Exclude External Stock"
 msgid "External Stock"
 msgstr "Ngoại trừ kho bên ngoài"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Deallocate Stock"
 msgid "Unallocated Stock"
 msgstr "Phân kho"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 #, fuzzy
 #| msgid "Part Stock"
 msgid "Variant Stock"
 msgstr "Kho hàng"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "Nhân bản sản phẩm"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr "Sao chép dữ liệu ban đầu từ sản phẩm khác"
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr "Số liệu kho ban đầu"
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr "Tạo sản phẩm với số lượng tồn kho ban đầu"
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr "Thông tin nhà cung cấp"
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr "Thêm thông tin nhà cung cấp ban đầu cho sản phẩm này"
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr "Sao chép thông số nhóm hàng"
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr "Sao chép mẫu tham số từ nhóm sản phẩm được chọn"
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr "Ảnh hiện có"
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr "Tên tệp của ảnh sản phẩm hiện hữu"
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr "Tệp hình ảnh không tồn tại"
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr "Hạn chế báo cáo kiểm kê với sản phẩm riêng biệt và sản phẩm biến thể bất kỳ"
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr "Hạn chế báo cáo kiểm kê với danh mục sản phẩm riêng biệt và danh mục con bất kỳ"
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr "Hạn chế báo cáo kiểm kê với vị trí kho riêng biệt và vị trí con bất kỳ"
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr "Ngoại trừ kho bên ngoài"
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr "Loại trừ hàng trong kho của vị trí bên ngoài"
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr "Tạo báo cáo"
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr "Tạo tệp báo cáo chứa dữ liệu kiểm kê đã tính toán"
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr "Cập nhật sản phẩm"
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr "Cập nhật sản phẩm cụ thể với dữ liệu kiểm kê đã tính"
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr "Chức năng kiểm kê chưa được bật"
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr "Giá trị tính toán ghi đè cho giá tối thiểu"
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr "Tiền tế giá tối thiểu"
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr "Giá trị tính toán ghi đè cho giá tối đa"
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr "Tiền tế giá tối đa"
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr "Cập nhật"
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr "Cập nhật giá cho sản phẩm này"
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr "Không thể chuyển đổi từ tiền tệ đã cung cấp cho {default_currency}"
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr "Giá tối thiểu không được lớn hơn giá tối đa"
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr "Giá tối đa không được nhỏ hơn giá tối thiểu"
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr "Chọn sản phẩm để sao chép định mức nguyên vật liệu"
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr "Xóa dữ liệu đã tồn tại"
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr "Xóa mục BOM đã tồn tại trước khi sao chép"
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr "Bao gồm thừa hưởng"
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr "Bao gồm mục BOM được thừa hưởng từ sản phẩm mẫu"
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr "Bỏ qua dòng không hợp lệ"
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr "Bật tùy chọn này để bỏ qua dòng không hợp lệ"
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr "Sao chép sản phẩm thay thế"
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr "Sao chép sản phẩm thay thế khi nhân bản hàng hóa BOM"
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr "Dọn dẹp BOM đang tồn tại"
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr "Xóa mục BOM đang tồn tại trước khi tải lên"
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr "Chưa chỉ ra cột sản phẩm"
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr "Tìm thấy nhiều sản phẩm phù hợp"
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr "Không tìm thấy sản phẩm nào"
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr "Sản phẩm không được chỉ định như là một thành phần"
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr "Chưa cung cấp số lượng"
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr "Số lượng không hợp lệ"
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr "Buộc phải nhập ít nhất một mục BOM"
 
@@ -8031,7 +8045,7 @@ msgstr "Viền"
 msgid "Print a border around each label"
 msgstr "In một viền xung quanh từng nhãn"
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr "Ngang"
 
@@ -8339,16 +8353,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "Chưa cung cấp đối tượng hợp lệ cho bản mẫu"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr "Tệp mẫu '{template}' đang bị lỗi hoặc không tồn tại"
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr "Báo cáo kiểm tra"
 
@@ -8368,103 +8382,115 @@ msgstr "Pháp lý"
 msgid "Letter"
 msgstr "Thư"
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr "Tên mẫu"
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr "Tệp mẫu báo cáo"
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr "Mô tả tệp mẫu báo cáo"
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr "Số phiên bản báo cáo (tự động tăng)"
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr "Khổ giấy cho báo cáo PDF"
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr "Tạo báo cáo theo hướng ngang"
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr "Quy tắc sinh tên tệp báo cáo"
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr "Mẫu báo cáo đang bật"
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr "Truy vấn bộ lọc hàng trong kho (dùng dấu phẩy liệt kê các cặp key=value)"
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr "Bao gồm các đợt kiểm tra đã lắp đặt"
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr "Bao gồm kết quả kiểm tra cho hàng trong kho được cài đặt bên trong hàng hóa đã lắp ráp"
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr "Dựng bộ lọc"
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr "Dựng bộ lọc truy vấn (dùng dấu phẩy liệt kê các cặp key=value"
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "Bộ lọc sản phẩm"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr "Bộ lọc truy vấn sản phẩm (dùng dấu phẩy liệt kê các cặp key=value"
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr "Bộ lọc truy vấn đơn đặt mua"
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr "Bộ lọc truy vấn đơn hàng bán"
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr "Bộ lọc truy vấn đơn hàng trả lại"
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Stock item with this serial number already exists"
+msgid "Snippet file with this name already exists"
+msgstr "Hàng trong kho với số sê ri này đã tồn tại"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr "Mẫu trích"
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr "Tệp báo cáo mẫu"
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr "Mô tả tệp báo cáo mẫu"
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "Tên của tệp đính kèm này đã tồn tại"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr "Tài sản"
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr "Tệp báo cáo tài sản"
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr "Mô tả tệp báo cáo tài sản"
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr "bộ lọc truy vấn vị trí kho (dùng dấu phẩy liệt kê các cặp key=value)"
 
@@ -8771,7 +8797,7 @@ msgstr "Bạn không thể chuyển đổi vị trí kho hàng này thành cấu
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr "Không thể đặt hàng trong kho vào trong địa điểm kho có cấu trúc!"
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr "Không thể tạo hàng hóa trong kho cho sản phẩm ảo"
 
@@ -8816,7 +8842,7 @@ msgstr "Chọn sản phẩm nhà cung cấp khớp với hàng hóa trong kho n
 msgid "Where is this stock item located?"
 msgstr "Hàng trong kho này được đặt ở đâu?"
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr "Đóng gói hàng hóa này được lưu trữ lại"
 
@@ -8828,7 +8854,7 @@ msgstr "Mục này đã được cài đặt trong mục khác?"
 msgid "Serial number for this item"
 msgstr "Số sê ri cho mục này"
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr "Mã lô cho hàng trong kho này"
 
@@ -8905,7 +8931,7 @@ msgstr "Số sêri phải là một danh sách dãy số nguyên"
 msgid "Quantity does not match serial numbers"
 msgstr "Số lượng không khớp với số sêri"
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "Số sêri đã tồn tại"
 
@@ -8937,7 +8963,7 @@ msgstr "Hàng trong kho hiện đang sản xuất"
 msgid "Serialized stock cannot be merged"
 msgstr "Không thể hợp nhất kho nối tiếp"
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr "Mặt hàng trùng lặp"
 
@@ -8985,184 +9011,184 @@ msgstr "Đính kèm kết quả kiểm thử"
 msgid "Test notes"
 msgstr "Ghi chú kiểm thử"
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr "Số sêri quá lớn"
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr "Sử dụng kích thước đóng gói khi thêm: Số lượng được định nghĩa là số của gói"
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr "Giá mua của mặt hàng, theo đơn vị hoặc gói"
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr "Nhập số của mặt hàng cần tạo số nối tiếp"
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr "Số lượng phải không vượt quá số lượng trong kho đang có ({q})"
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "Điền số sêri cho hàng hóa mới"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr "Vị trí kho đích"
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr "Trường ghi chú tùy chọn"
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr "Không thể gán số sêri cho sản phẩm này"
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr "Chọn mặt hàng để lắp đặt"
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr "Số lượng để cài đặt"
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr "Nhập số lượng hàng hóa để cài đặt"
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr "Thêm ghi chú giao dịch (tùy chọn)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr "Số lượng cần cài đặt phải ít nhất là 1"
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr "Mặt hàng không khả dụng"
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr "Sản phẩm đã chọn không có trong hóa đơn vật liệu"
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr "Số lượng cần lắp đặt phải không vượt quá số lượng đang có"
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr "Vị trí đích cho hàng hóa bị gỡ bỏ"
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr "Chọn sản phẩm để chuyển đổi mặt hàng vào bên trong"
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr "Sản phẩm đã chọn không phải là tùy chọn hợp lệ để chuyển đổi"
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr "Không thể chuyển đổi hàng hóa với sản phẩm nhà cung cấp đã gán"
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr "Vị trí đích dành cho hàng hóa trả lại"
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr "Chọn mặt hàng để đổi trạng thái"
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr "Không có mặt hàng nào được chọn"
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr "Kho phụ"
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr "Sản phẩm phải có thể bán được"
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr "Hàng hóa được phân bổ đến một đơn hàng bán"
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr "Hàng hóa được phân bổ đến một đơn đặt bản dựng"
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr "Khách hàng được gán vào các mặt hàng"
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr "Công ty đã chọn không phải là khách hàng"
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr "Ghi chú phân bổ kho"
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr "Phải cung cấp danh sách mặt hàng"
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr "Ghi chú gộp kho"
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr "Cho phép nhiều nhà cung không khớp"
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr "Cho phép mặt hàng cùng sản phẩm nhà cung cấp khác phải được gộp"
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr "Cho phép trạng thái không khớp"
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr "Cho phép mặt hàng với mã trạng thái khác nhau để gộp lại"
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr "Cần cung cấp ít nhất hai mặt hàng"
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr "Giá trị khóa chính mặt hàng"
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr "Mã trạng thái mặt hàng"
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr "Ghi chú giao dịch kho"
 
diff --git a/InvenTree/locale/zh/LC_MESSAGES/django.po b/InvenTree/locale/zh/LC_MESSAGES/django.po
index e4dbd73737c3..be91a06c98df 100644
--- a/InvenTree/locale/zh/LC_MESSAGES/django.po
+++ b/InvenTree/locale/zh/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2024-02-28 07:23\n"
 "Last-Translator: \n"
 "Language-Team: Chinese Traditional\n"
@@ -30,20 +30,20 @@ msgstr "使用者沒有檢視此模型的權限"
 msgid "Invalid unit provided ({unit})"
 msgstr ""
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 msgid "No value provided"
 msgstr "未提供值"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 msgid "Invalid quantity supplied"
 msgstr ""
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, python-brace-format
 msgid "Invalid quantity supplied ({exc})"
 msgstr ""
@@ -65,9 +65,9 @@ msgstr "輸入日期"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -132,42 +132,42 @@ msgstr "所提供的Email網域尚未被核准。"
 msgid "Registration is disabled."
 msgstr "註冊功能已停用。"
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "提供的數量無效"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "序號為空白"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "重複的序號"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, python-brace-format
 msgid "Invalid group range: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, python-brace-format
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, python-brace-format
 msgid "Invalid group sequence: {group}"
 msgstr ""
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "找不到序號"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr ""
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "從這個值中移除HTML標籤"
 
@@ -401,7 +401,7 @@ msgstr "附件"
 msgid "Select file to attach"
 msgstr "選擇附件"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -432,9 +432,9 @@ msgstr "註解"
 msgid "File comment"
 msgstr "檔案註解"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -479,10 +479,10 @@ msgstr "同一個上層元件下不能有重複的名字"
 msgid "Invalid choice"
 msgstr "無效的選項"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -506,10 +506,10 @@ msgstr "名稱"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -581,7 +581,7 @@ msgstr "伺服器錯誤"
 msgid "An error has been logged by the server."
 msgstr "伺服器紀錄了一個錯誤。"
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "必須是有效的數字"
 
@@ -678,7 +678,7 @@ msgstr "遠端圖片的URL"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "尚未啟用從遠端URL下載圖片"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "背景工作程式檢查失敗"
 
@@ -938,14 +938,14 @@ msgstr "關於InvenTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "工單必須被取消才能被刪除"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr "耗材"
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1014,7 +1014,7 @@ msgstr "生產工單代號"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1046,9 +1046,9 @@ msgstr "這張生產工單對應的上層生產工單"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1059,7 +1059,7 @@ msgstr "這張生產工單對應的上層生產工單"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1146,8 +1146,8 @@ msgstr "生產狀態"
 msgid "Build status code"
 msgstr "生產狀態代碼"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "批量代碼"
@@ -1264,9 +1264,9 @@ msgid "Build output does not match Build Order"
 msgstr "生產品項與生產工單不符"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "數量必須大於零"
 
@@ -1285,10 +1285,10 @@ msgstr ""
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1298,7 +1298,7 @@ msgstr ""
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1359,9 +1359,9 @@ msgstr "有序號的品項數量必須為1"
 msgid "Selected stock item does not match BOM line"
 msgstr "選擇的庫存品項和BOM的項目不符"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1425,8 +1425,8 @@ msgstr "可追蹤的零件數量必須為整數"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "因為BOM包含可追蹤的零件,所以數量必須為整數"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "序號"
@@ -1451,10 +1451,10 @@ msgstr "序號已存在或無效"
 msgid "A list of build outputs must be provided"
 msgstr "必須提供產出清單"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1493,8 +1493,8 @@ msgstr ""
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1566,7 +1566,7 @@ msgstr ""
 msgid "Required stock has not been fully allocated"
 msgstr ""
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "接受不完整"
 
@@ -1602,11 +1602,11 @@ msgstr ""
 msgid "bom_item.part must point to the same part as the build order"
 msgstr ""
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "商品必須有庫存"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr ""
@@ -1619,7 +1619,7 @@ msgstr ""
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr ""
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr ""
 
@@ -1659,7 +1659,7 @@ msgstr ""
 msgid "Allocate optional BOM items to build order"
 msgstr ""
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr ""
@@ -1669,7 +1669,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1677,13 +1677,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr ""
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2117,1390 +2117,1398 @@ msgstr ""
 msgid "User or group responsible for this project"
 msgstr ""
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr ""
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr ""
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr ""
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr ""
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr ""
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr ""
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr ""
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr ""
 
-#: common/models.py:1143
+#: common/models.py:1150
 msgid "No plugin"
 msgstr ""
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr ""
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr ""
 
-#: common/models.py:1238
+#: common/models.py:1245
 msgid "Pending migrations"
 msgstr ""
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr ""
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr ""
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr ""
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "天"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr "自動備份"
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr "啟動資料庫和媒體文件自動備份"
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr "自動備份間隔"
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 msgid "Enable barcode scanner support in the web interface"
 msgstr ""
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 msgid "Part Revisions"
 msgstr ""
 
-#: common/models.py:1405
+#: common/models.py:1412
 msgid "Enable revision field for Part"
 msgstr ""
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr ""
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr ""
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr ""
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr ""
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr ""
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr ""
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr ""
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr ""
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr ""
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr ""
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr ""
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 msgid "Enforce Parameter Units"
 msgstr ""
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr ""
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr ""
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr ""
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr ""
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+msgid "Log Report Errors"
+msgstr ""
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr ""
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr ""
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr ""
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr ""
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr ""
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr ""
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr ""
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr ""
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 msgid "Show Installed Stock Items"
 msgstr ""
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 msgid "Enable Return Orders"
 msgstr ""
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 msgid "Return Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 msgid "Edit Completed Return Orders"
 msgstr ""
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 msgid "Auto Complete Purchase Orders"
 msgstr ""
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 msgid "Enable project codes"
 msgstr ""
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 msgid "Exclude External Locations"
 msgstr ""
 
-#: common/models.py:1958
+#: common/models.py:1971
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr ""
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 msgid "Hide inactive parts"
 msgstr ""
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr ""
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr ""
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr ""
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr ""
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 msgid "Show pending SO shipments on the homepage"
 msgstr ""
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr ""
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr ""
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 msgid "Search Return Orders"
 msgstr ""
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr ""
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 msgid "Regex Search"
 msgstr ""
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr ""
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr ""
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 msgid "Default part label template"
 msgstr ""
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 msgid "Default stock item template"
 msgstr ""
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 msgid "Default stock location label template"
 msgstr ""
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3508,23 +3516,23 @@ msgstr ""
 msgid "Price"
 msgstr ""
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3534,101 +3542,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr ""
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3638,31 +3646,31 @@ msgstr ""
 msgid "Image"
 msgstr ""
 
-#: common/models.py:2960
+#: common/models.py:2973
 msgid "Image file"
 msgstr ""
 
-#: common/models.py:3002
+#: common/models.py:3015
 msgid "Unit name must be a valid identifier"
 msgstr ""
 
-#: common/models.py:3021
+#: common/models.py:3034
 msgid "Unit name"
 msgstr ""
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 msgid "Optional unit symbol"
 msgstr ""
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 msgid "Definition"
 msgstr ""
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -3966,7 +3974,7 @@ msgid "Link to address information (external)"
 msgstr ""
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -3977,7 +3985,7 @@ msgstr ""
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -3992,7 +4000,7 @@ msgid "Select manufacturer"
 msgstr ""
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4038,7 +4046,7 @@ msgid "Parameter value"
 msgstr ""
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4064,7 +4072,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4081,7 +4089,7 @@ msgstr ""
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4098,13 +4106,13 @@ msgid "Supplier part description"
 msgstr ""
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr ""
 
@@ -4117,7 +4125,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4223,7 +4231,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4434,7 +4442,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4534,7 +4542,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4584,10 +4592,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4647,7 +4655,7 @@ msgstr ""
 msgid "Label template file"
 msgstr ""
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4673,7 +4681,7 @@ msgstr ""
 msgid "Label height, specified in mm"
 msgstr ""
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr ""
 
@@ -4687,8 +4695,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr ""
 
@@ -4846,11 +4854,11 @@ msgstr ""
 msgid "Total price for this order"
 msgstr ""
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 msgid "Order Currency"
 msgstr ""
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5037,7 +5045,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5092,8 +5100,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5141,7 +5149,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5215,159 +5223,159 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 msgid "Auto Pricing"
 msgstr ""
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 msgid "Merge Items"
 msgstr ""
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr ""
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 msgid "Scanned barcode"
 msgstr ""
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 msgid "Line item does not match return order"
 msgstr ""
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 msgid "Line item has already been received"
 msgstr ""
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 msgid "Line price currency"
 msgstr ""
 
@@ -5771,12 +5779,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr ""
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -5793,7 +5801,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -5869,8 +5877,8 @@ msgstr ""
 msgid "Category Path"
 msgstr ""
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -5893,17 +5901,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -5981,8 +5989,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -5999,7 +6007,7 @@ msgstr ""
 msgid "Default Location"
 msgstr ""
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6008,7 +6016,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr ""
@@ -6090,7 +6098,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr ""
 
@@ -6424,602 +6432,608 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "已有同檔案名稱的附件"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 msgid "Choices must be unique"
 msgstr ""
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 msgid "Invalid choice for parameter value"
 msgstr ""
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr ""
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 msgid "This BOM item has been validated"
 msgstr ""
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr ""
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 msgid "No parts selected"
 msgstr ""
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 msgid "Select category"
 msgstr ""
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 msgid "Copy Notes"
 msgstr ""
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "外部連結"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Allocate Stock"
 msgid "Unallocated Stock"
 msgstr "分配庫存"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 msgid "Variant Stock"
 msgstr ""
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr ""
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr ""
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 msgid "Existing Image"
 msgstr ""
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 msgid "Image file does not exist"
 msgstr ""
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 msgid "Exclude stock items in external locations"
 msgstr ""
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 msgid "Minimum price currency"
 msgstr ""
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 msgid "Maximum price currency"
 msgstr ""
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8029,7 +8043,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8337,16 +8351,16 @@ msgstr ""
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr ""
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8366,103 +8380,115 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 msgid "Page size for PDF reports"
 msgstr ""
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr ""
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "已有同檔案名稱的附件"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "已有同檔案名稱的附件"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 msgid "stock location query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
@@ -8769,7 +8795,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -8814,7 +8840,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8826,7 +8852,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8903,7 +8929,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -8935,7 +8961,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -8983,184 +9009,184 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 msgid "Test template for this result"
 msgstr ""
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 msgid "Template ID or test name must be provided"
 msgstr ""
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 msgid "Enter the quantity of items to install"
 msgstr ""
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 msgid "Quantity to install must be at least 1"
 msgstr ""
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 msgid "Quantity to install must not exceed available quantity"
 msgstr ""
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 msgid "Select stock items to change status"
 msgstr ""
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 msgid "No stock items selected"
 msgstr ""
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 msgid "No Change"
 msgstr ""
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 msgid "Stock item status code"
 msgstr ""
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po b/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po
index b9979984b8f3..187caad0777f 100644
--- a/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-05 00:41+0000\n"
+"POT-Creation-Date: 2024-03-15 01:07+0000\n"
 "PO-Revision-Date: 2023-02-28 22:38\n"
 "Last-Translator: \n"
 "Language-Team: Chinese Simplified\n"
@@ -31,24 +31,24 @@ msgstr ""
 msgid "Invalid unit provided ({unit})"
 msgstr "提供的数量无效"
 
-#: InvenTree/conversion.py:170
+#: InvenTree/conversion.py:177
 #, fuzzy
 #| msgid "No value set"
 msgid "No value provided"
 msgstr "未设置值"
 
-#: InvenTree/conversion.py:198
+#: InvenTree/conversion.py:205
 #, python-brace-format
 msgid "Could not convert {original} to {unit}"
 msgstr ""
 
-#: InvenTree/conversion.py:200
+#: InvenTree/conversion.py:207
 #, fuzzy
 #| msgid "Invalid quantity provided"
 msgid "Invalid quantity supplied"
 msgstr "提供的数量无效"
 
-#: InvenTree/conversion.py:214
+#: InvenTree/conversion.py:221
 #, fuzzy, python-brace-format
 #| msgid "Invalid quantity provided"
 msgid "Invalid quantity supplied ({exc})"
@@ -71,9 +71,9 @@ msgstr "输入日期"
 #: part/models.py:3174 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
 #: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
-#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
-#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:487 stock/serializers.py:640 stock/serializers.py:736
+#: stock/serializers.py:786 stock/serializers.py:1095 stock/serializers.py:1184
+#: stock/serializers.py:1349 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
 #: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1080
@@ -138,47 +138,47 @@ msgstr "提供的电子邮件域未被核准。"
 msgid "Registration is disabled."
 msgstr ""
 
-#: InvenTree/helpers.py:512 order/models.py:529 order/models.py:731
+#: InvenTree/helpers.py:528 order/models.py:529 order/models.py:731
 msgid "Invalid quantity provided"
 msgstr "提供的数量无效"
 
-#: InvenTree/helpers.py:520
+#: InvenTree/helpers.py:536
 msgid "Empty serial number string"
 msgstr "空序列号字符串"
 
-#: InvenTree/helpers.py:549
+#: InvenTree/helpers.py:565
 msgid "Duplicate serial"
 msgstr "重复的序列号"
 
-#: InvenTree/helpers.py:581 InvenTree/helpers.py:624
+#: InvenTree/helpers.py:597 InvenTree/helpers.py:640
 #, fuzzy, python-brace-format
 #| msgid "Invalid group range: {g}"
 msgid "Invalid group range: {group}"
 msgstr "无效的组范围: {g}"
 
-#: InvenTree/helpers.py:612
+#: InvenTree/helpers.py:628
 #, fuzzy, python-brace-format
 #| msgid "Group range {g} exceeds allowed quantity ({q})"
 msgid "Group range {group} exceeds allowed quantity ({expected_quantity})"
 msgstr "组 {g} 超出了允许的数量 ({q})"
 
-#: InvenTree/helpers.py:642 InvenTree/helpers.py:649 InvenTree/helpers.py:668
+#: InvenTree/helpers.py:658 InvenTree/helpers.py:665 InvenTree/helpers.py:684
 #, fuzzy, python-brace-format
 #| msgid "Invalid group sequence: {g}"
 msgid "Invalid group sequence: {group}"
 msgstr "无效的组序列: {g}"
 
-#: InvenTree/helpers.py:678
+#: InvenTree/helpers.py:694
 msgid "No serial numbers found"
 msgstr "未找到序列号"
 
-#: InvenTree/helpers.py:683
+#: InvenTree/helpers.py:699
 #, fuzzy
 #| msgid "Number of unique serial numbers ({s}) must match quantity ({q})"
 msgid "Number of unique serial numbers ({len(serials)}) must match quantity ({expected_quantity})"
 msgstr "唯一序列号 ({s}) 必须匹配数量 ({q})"
 
-#: InvenTree/helpers.py:801
+#: InvenTree/helpers.py:817
 msgid "Remove HTML tags from this value"
 msgstr "从这个值中删除 HTML 标签"
 
@@ -420,7 +420,7 @@ msgstr "附件"
 msgid "Select file to attach"
 msgstr "选择附件"
 
-#: InvenTree/models.py:568 common/models.py:2934 company/models.py:145
+#: InvenTree/models.py:568 common/models.py:2947 company/models.py:145
 #: company/models.py:452 company/models.py:509 company/models.py:818
 #: order/models.py:279 order/models.py:1276 order/models.py:1690
 #: part/admin.py:55 part/models.py:918
@@ -451,9 +451,9 @@ msgstr "注释"
 msgid "File comment"
 msgstr "文件注释"
 
-#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2410
-#: common/models.py:2411 common/models.py:2635 common/models.py:2636
-#: common/models.py:2881 common/models.py:2882 part/models.py:3184
+#: InvenTree/models.py:584 InvenTree/models.py:585 common/models.py:2423
+#: common/models.py:2424 common/models.py:2648 common/models.py:2649
+#: common/models.py:2894 common/models.py:2895 part/models.py:3184
 #: part/models.py:3271 part/models.py:3364 part/models.py:3392
 #: plugin/models.py:251 plugin/models.py:252
 #: report/templates/report/inventree_test_report_base.html:105
@@ -498,10 +498,10 @@ msgstr ""
 msgid "Invalid choice"
 msgstr "选择无效"
 
-#: InvenTree/models.py:894 common/models.py:2622 common/models.py:3020
+#: InvenTree/models.py:894 common/models.py:2635 common/models.py:3033
 #: common/serializers.py:370 company/models.py:608 label/models.py:120
-#: machine/models.py:24 part/models.py:854 part/models.py:3606
-#: plugin/models.py:41 report/models.py:174 stock/models.py:76
+#: machine/models.py:24 part/models.py:854 part/models.py:3615
+#: plugin/models.py:41 report/models.py:175 stock/models.py:76
 #: templates/InvenTree/settings/mixins/urls.html:13
 #: templates/InvenTree/settings/notifications.html:17
 #: templates/InvenTree/settings/plugin.html:81
@@ -525,10 +525,10 @@ msgstr "名称"
 #: company/templates/company/manufacturer_part.html:75
 #: company/templates/company/supplier_part.html:107 label/models.py:127
 #: order/models.py:265 order/models.py:1304 part/admin.py:303 part/admin.py:414
-#: part/models.py:877 part/models.py:3621 part/templates/part/category.html:82
+#: part/models.py:877 part/models.py:3630 part/templates/part/category.html:82
 #: part/templates/part/part_base.html:170
-#: part/templates/part/part_scheduling.html:12 report/models.py:187
-#: report/models.py:622 report/models.py:667
+#: part/templates/part/part_scheduling.html:12 report/models.py:188
+#: report/models.py:654 report/models.py:728
 #: report/templates/report/inventree_build_order_base.html:117
 #: stock/admin.py:55 stock/models.py:82 stock/templates/stock/location.html:125
 #: templates/InvenTree/settings/notifications.html:19
@@ -602,7 +602,7 @@ msgstr "服务器错误"
 msgid "An error has been logged by the server."
 msgstr "服务器记录了一个错误。"
 
-#: InvenTree/serializers.py:62 part/models.py:4134
+#: InvenTree/serializers.py:62 part/models.py:4143
 msgid "Must be a valid number"
 msgstr "必须是有效数字"
 
@@ -703,7 +703,7 @@ msgstr "远程图像文件的 URL"
 msgid "Downloading images from remote URL is not enabled"
 msgstr "未启用从远程 URL下载图像"
 
-#: InvenTree/status.py:66 part/serializers.py:1138
+#: InvenTree/status.py:66 part/serializers.py:1156
 msgid "Background worker check failed"
 msgstr "后台工作人员检查失败"
 
@@ -981,14 +981,14 @@ msgstr "关于 InventTree"
 msgid "Build must be cancelled before it can be deleted"
 msgstr "在删除前必须取消生产"
 
-#: build/api.py:281 part/models.py:4012 templates/js/translated/bom.js:997
+#: build/api.py:281 part/models.py:4021 templates/js/translated/bom.js:997
 #: templates/js/translated/bom.js:1037 templates/js/translated/build.js:2521
 #: templates/js/translated/table_filters.js:190
 #: templates/js/translated/table_filters.js:583
 msgid "Consumable"
 msgstr ""
 
-#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
+#: build/api.py:282 part/models.py:4015 part/templates/part/upload_bom.html:58
 #: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
 #: templates/js/translated/build.js:2530
 #: templates/js/translated/table_filters.js:186
@@ -1059,7 +1059,7 @@ msgstr "相关生产订单"
 
 #: build/models.py:174 order/models.py:430 order/models.py:886
 #: order/models.py:1264 order/models.py:1981 part/admin.py:417
-#: part/models.py:4027 part/templates/part/upload_bom.html:54
+#: part/models.py:4036 part/templates/part/upload_bom.html:54
 #: report/templates/report/inventree_bill_of_materials_report.html:139
 #: report/templates/report/inventree_po_report_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:26
@@ -1093,9 +1093,9 @@ msgstr "此次生产匹配的订单"
 #: order/models.py:1389 order/models.py:1532 order/models.py:1533
 #: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
 #: part/models.py:3147 part/models.py:3291 part/models.py:3314
-#: part/models.py:3335 part/models.py:3357 part/models.py:3458
-#: part/models.py:3754 part/models.py:3885 part/models.py:3978
-#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
+#: part/models.py:3335 part/models.py:3357 part/models.py:3467
+#: part/models.py:3763 part/models.py:3894 part/models.py:3987
+#: part/models.py:4348 part/serializers.py:1102 part/serializers.py:1677
 #: part/templates/part/part_app_base.html:8
 #: part/templates/part/part_pricing.html:12
 #: part/templates/part/upload_bom.html:52
@@ -1106,7 +1106,7 @@ msgstr "此次生产匹配的订单"
 #: report/templates/report/inventree_return_order_report_base.html:24
 #: report/templates/report/inventree_slr_report.html:102
 #: report/templates/report/inventree_so_report_base.html:27
-#: stock/serializers.py:252 stock/serializers.py:662
+#: stock/serializers.py:253 stock/serializers.py:670
 #: templates/InvenTree/search.html:82
 #: templates/email/build_order_completed.html:17
 #: templates/email/build_order_required_stock.html:17
@@ -1193,8 +1193,8 @@ msgstr "生产状态"
 msgid "Build status code"
 msgstr "生产状态代码"
 
-#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1306
+#: build/models.py:264 build/serializers.py:280 order/serializers.py:571
+#: stock/models.py:826 stock/serializers.py:1314
 #: templates/js/translated/purchase_order.js:1129
 msgid "Batch Code"
 msgstr "批量代码"
@@ -1315,9 +1315,9 @@ msgid "Build output does not match Build Order"
 msgstr "生产产出与订单不匹配"
 
 #: build/models.py:878 build/serializers.py:223 build/serializers.py:262
-#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
-#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
+#: build/serializers.py:831 order/models.py:526 order/serializers.py:423
+#: order/serializers.py:566 part/serializers.py:1460 part/serializers.py:1835
+#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:458
 msgid "Quantity must be greater than zero"
 msgstr "数量必须大于0"
 
@@ -1340,10 +1340,10 @@ msgstr "生产备注"
 
 #: build/models.py:1316 build/models.py:1574 build/serializers.py:210
 #: build/serializers.py:247 build/templates/build/build_base.html:102
-#: build/templates/build/detail.html:34 common/models.py:2432
-#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
+#: build/templates/build/detail.html:34 common/models.py:2445
+#: order/models.py:1247 order/models.py:1902 order/serializers.py:1328
 #: order/templates/order/order_wizard/match_parts.html:30 part/admin.py:416
-#: part/forms.py:48 part/models.py:3161 part/models.py:4000
+#: part/forms.py:48 part/models.py:3161 part/models.py:4009
 #: part/templates/part/part_pricing.html:16
 #: part/templates/part/upload_bom.html:53
 #: report/templates/report/inventree_bill_of_materials_report.html:138
@@ -1353,7 +1353,7 @@ msgstr "生产备注"
 #: report/templates/report/inventree_so_report_base.html:29
 #: report/templates/report/inventree_test_report_base.html:90
 #: report/templates/report/inventree_test_report_base.html:170
-#: stock/admin.py:160 stock/serializers.py:441
+#: stock/admin.py:160 stock/serializers.py:449
 #: stock/templates/stock/item_base.html:287
 #: stock/templates/stock/item_base.html:295
 #: stock/templates/stock/item_base.html:342
@@ -1418,9 +1418,9 @@ msgstr "序列化库存的数量必须是 1"
 msgid "Selected stock item does not match BOM line"
 msgstr "在BOM中找不到选定的库存项"
 
-#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
-#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1172
+#: order/serializers.py:1193 stock/serializers.py:552 stock/serializers.py:1033
+#: stock/serializers.py:1145 stock/templates/stock/item_base.html:10
 #: stock/templates/stock/item_base.html:23
 #: stock/templates/stock/item_base.html:194
 #: templates/js/translated/build.js:1742
@@ -1484,8 +1484,8 @@ msgstr "对于可追踪的部件,需要整数型数值"
 msgid "Integer quantity required, as the bill of materials contains trackable parts"
 msgstr "需要整数型数值,因为BOM包含可追踪的部件"
 
-#: build/serializers.py:287 order/serializers.py:557 order/serializers.py:1310
-#: stock/serializers.py:461 templates/js/translated/purchase_order.js:1153
+#: build/serializers.py:287 order/serializers.py:579 order/serializers.py:1332
+#: stock/serializers.py:469 templates/js/translated/purchase_order.js:1153
 #: templates/js/translated/stock.js:367 templates/js/translated/stock.js:565
 msgid "Serial Numbers"
 msgstr "序列号"
@@ -1510,10 +1510,10 @@ msgstr "以下序列号已存在或无效"
 msgid "A list of build outputs must be provided"
 msgstr "必须提供生产产出列表"
 
-#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
-#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1169 stock/serializers.py:1425
+#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:555
+#: order/serializers.py:663 order/serializers.py:1668 part/serializers.py:1122
+#: stock/serializers.py:480 stock/serializers.py:635 stock/serializers.py:731
+#: stock/serializers.py:1177 stock/serializers.py:1433
 #: stock/templates/stock/item_base.html:394
 #: templates/js/translated/barcode.js:547
 #: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1558,8 +1558,8 @@ msgstr "已完成生产产出的仓储地点"
 
 #: build/serializers.py:505 build/templates/build/build_base.html:151
 #: build/templates/build/detail.html:62 order/models.py:910
-#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1313
+#: order/models.py:2005 order/serializers.py:587 stock/admin.py:165
+#: stock/serializers.py:782 stock/serializers.py:1321
 #: stock/templates/stock/item_base.html:427
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
 #: templates/js/translated/purchase_order.js:1308
@@ -1631,7 +1631,7 @@ msgstr "接受库存项未被完成分配至此生产订单"
 msgid "Required stock has not been fully allocated"
 msgstr "所需库存尚未完全分配"
 
-#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
+#: build/serializers.py:684 order/serializers.py:291 order/serializers.py:1235
 msgid "Accept Incomplete"
 msgstr "接受未完成"
 
@@ -1671,11 +1671,11 @@ msgstr "删除参数"
 msgid "bom_item.part must point to the same part as the build order"
 msgstr "bom_item.part 必须与生产订单指向相同的部件"
 
-#: build/serializers.py:817 stock/serializers.py:1038
+#: build/serializers.py:817 stock/serializers.py:1046
 msgid "Item must be in stock"
 msgstr "项目必须在库存中"
 
-#: build/serializers.py:865 order/serializers.py:1204
+#: build/serializers.py:865 order/serializers.py:1226
 #, python-brace-format
 msgid "Available quantity ({q}) exceeded"
 msgstr "可用量 ({q}) 超出了限制"
@@ -1688,7 +1688,7 @@ msgstr "对于被追踪的部件的分配,必须指定生产产出"
 msgid "Build output cannot be specified for allocation of untracked parts"
 msgstr "对于未被追踪的部件,无法指定生产产出"
 
-#: build/serializers.py:902 order/serializers.py:1456
+#: build/serializers.py:902 order/serializers.py:1478
 msgid "Allocation items must be provided"
 msgstr "必须提供分配的项"
 
@@ -1728,7 +1728,7 @@ msgstr "可选项目"
 msgid "Allocate optional BOM items to build order"
 msgstr "分配可选的BOM项目来建立订单"
 
-#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3904 part/models.py:4340
 #: stock/api.py:745
 msgid "BOM Item"
 msgstr "BOM项"
@@ -1738,7 +1738,7 @@ msgid "Allocated Stock"
 msgstr ""
 
 #: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:798 part/serializers.py:1460
+#: part/serializers.py:815 part/serializers.py:1478
 #: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
 #: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
 #: templates/js/translated/part.js:2148
@@ -1746,13 +1746,13 @@ msgstr ""
 msgid "On Order"
 msgstr ""
 
-#: build/serializers.py:1116 part/serializers.py:1462
+#: build/serializers.py:1116 part/serializers.py:1480
 #: templates/js/translated/build.js:2618
 #: templates/js/translated/table_filters.js:360
 msgid "In Production"
 msgstr "正在生产"
 
-#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1491
 #: part/templates/part/part_base.html:192
 #: templates/js/translated/sales_order.js:1893
 msgid "Available Stock"
@@ -2207,1432 +2207,1442 @@ msgstr "商品描述"
 msgid "User or group responsible for this project"
 msgstr "负责此订单的用户或群组"
 
-#: common/models.py:737
+#: common/models.py:744
 msgid "Settings key (must be unique - case insensitive)"
 msgstr "设置键值(必须是唯一的 - 大小写不敏感)"
 
-#: common/models.py:741
+#: common/models.py:748
 msgid "Settings value"
 msgstr "设定值"
 
-#: common/models.py:793
+#: common/models.py:800
 msgid "Chosen value is not a valid option"
 msgstr "选择的值不是一个有效的选项"
 
-#: common/models.py:809
+#: common/models.py:816
 msgid "Value must be a boolean value"
 msgstr "值必须是布尔量"
 
-#: common/models.py:817
+#: common/models.py:824
 msgid "Value must be an integer value"
 msgstr "值必须为整数"
 
-#: common/models.py:854
+#: common/models.py:861
 msgid "Key string must be unique"
 msgstr "关键字必须是唯一的"
 
-#: common/models.py:1086
+#: common/models.py:1093
 msgid "No group"
 msgstr "无群组"
 
-#: common/models.py:1129
+#: common/models.py:1136
 msgid "An empty domain is not allowed."
 msgstr "不允许空域。"
 
-#: common/models.py:1131
+#: common/models.py:1138
 #, python-brace-format
 msgid "Invalid domain name: {domain}"
 msgstr "无效的域名: {domain}"
 
-#: common/models.py:1143
+#: common/models.py:1150
 #, fuzzy
 #| msgid "Subcategories"
 msgid "No plugin"
 msgstr "子类别"
 
-#: common/models.py:1229
+#: common/models.py:1236
 msgid "Restart required"
 msgstr "需要重启"
 
-#: common/models.py:1231
+#: common/models.py:1238
 msgid "A setting has been changed which requires a server restart"
 msgstr "设置已更改,需要服务器重启"
 
-#: common/models.py:1238
+#: common/models.py:1245
 #, fuzzy
 #| msgid "Printing Actions"
 msgid "Pending migrations"
 msgstr "打印操作"
 
-#: common/models.py:1239
+#: common/models.py:1246
 msgid "Number of pending database migrations"
 msgstr ""
 
-#: common/models.py:1244
+#: common/models.py:1251
 msgid "Server Instance Name"
 msgstr "服务器实例名称"
 
-#: common/models.py:1246
+#: common/models.py:1253
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:1250
+#: common/models.py:1257
 msgid "Use instance name"
 msgstr ""
 
-#: common/models.py:1251
+#: common/models.py:1258
 msgid "Use the instance name in the title-bar"
 msgstr ""
 
-#: common/models.py:1256
+#: common/models.py:1263
 msgid "Restrict showing `about`"
 msgstr ""
 
-#: common/models.py:1257
+#: common/models.py:1264
 msgid "Show the `about` modal only to superusers"
 msgstr ""
 
-#: common/models.py:1262 company/models.py:107 company/models.py:108
+#: common/models.py:1269 company/models.py:107 company/models.py:108
 msgid "Company name"
 msgstr "公司名称"
 
-#: common/models.py:1263
+#: common/models.py:1270
 msgid "Internal company name"
 msgstr "内部公司名称"
 
-#: common/models.py:1267
+#: common/models.py:1274
 msgid "Base URL"
 msgstr ""
 
-#: common/models.py:1268
+#: common/models.py:1275
 msgid "Base URL for server instance"
 msgstr ""
 
-#: common/models.py:1274
+#: common/models.py:1281
 msgid "Default Currency"
 msgstr ""
 
-#: common/models.py:1275
+#: common/models.py:1282
 msgid "Select base currency for pricing calculations"
 msgstr ""
 
-#: common/models.py:1281
+#: common/models.py:1288
 msgid "Currency Update Interval"
 msgstr ""
 
-#: common/models.py:1283
+#: common/models.py:1290
 msgid "How often to update exchange rates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1286 common/models.py:1342 common/models.py:1355
-#: common/models.py:1363 common/models.py:1372 common/models.py:1381
-#: common/models.py:1583 common/models.py:1605 common/models.py:1714
-#: common/models.py:1977
+#: common/models.py:1293 common/models.py:1349 common/models.py:1362
+#: common/models.py:1370 common/models.py:1379 common/models.py:1388
+#: common/models.py:1590 common/models.py:1612 common/models.py:1727
+#: common/models.py:1990
 msgid "days"
 msgstr "天"
 
-#: common/models.py:1290
+#: common/models.py:1297
 msgid "Currency Update Plugin"
 msgstr ""
 
-#: common/models.py:1291
+#: common/models.py:1298
 msgid "Currency update plugin to use"
 msgstr ""
 
-#: common/models.py:1296
+#: common/models.py:1303
 msgid "Download from URL"
 msgstr ""
 
-#: common/models.py:1298
+#: common/models.py:1305
 msgid "Allow download of remote images and files from external URL"
 msgstr ""
 
-#: common/models.py:1304
+#: common/models.py:1311
 msgid "Download Size Limit"
 msgstr ""
 
-#: common/models.py:1305
+#: common/models.py:1312
 msgid "Maximum allowable download size for remote image"
 msgstr ""
 
-#: common/models.py:1311
+#: common/models.py:1318
 msgid "User-agent used to download from URL"
 msgstr ""
 
-#: common/models.py:1313
+#: common/models.py:1320
 msgid "Allow to override the user-agent used to download images and files from external URL (leave blank for the default)"
 msgstr ""
 
-#: common/models.py:1318
+#: common/models.py:1325
 msgid "Strict URL Validation"
 msgstr ""
 
-#: common/models.py:1319
+#: common/models.py:1326
 msgid "Require schema specification when validating URLs"
 msgstr ""
 
-#: common/models.py:1324
+#: common/models.py:1331
 msgid "Require confirm"
 msgstr ""
 
-#: common/models.py:1325
+#: common/models.py:1332
 msgid "Require explicit user confirmation for certain action."
 msgstr ""
 
-#: common/models.py:1330
+#: common/models.py:1337
 msgid "Tree Depth"
 msgstr ""
 
-#: common/models.py:1332
+#: common/models.py:1339
 msgid "Default tree depth for treeview. Deeper levels can be lazy loaded as they are needed."
 msgstr ""
 
-#: common/models.py:1338
+#: common/models.py:1345
 msgid "Update Check Interval"
 msgstr ""
 
-#: common/models.py:1339
+#: common/models.py:1346
 msgid "How often to check for updates (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1345
+#: common/models.py:1352
 msgid "Automatic Backup"
 msgstr ""
 
-#: common/models.py:1346
+#: common/models.py:1353
 msgid "Enable automatic backup of database and media files"
 msgstr ""
 
-#: common/models.py:1351
+#: common/models.py:1358
 msgid "Auto Backup Interval"
 msgstr ""
 
-#: common/models.py:1352
+#: common/models.py:1359
 msgid "Specify number of days between automated backup events"
 msgstr ""
 
-#: common/models.py:1358
+#: common/models.py:1365
 msgid "Task Deletion Interval"
 msgstr ""
 
-#: common/models.py:1360
+#: common/models.py:1367
 msgid "Background task results will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1367
+#: common/models.py:1374
 msgid "Error Log Deletion Interval"
 msgstr ""
 
-#: common/models.py:1369
+#: common/models.py:1376
 msgid "Error logs will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1376
+#: common/models.py:1383
 msgid "Notification Deletion Interval"
 msgstr ""
 
-#: common/models.py:1378
+#: common/models.py:1385
 msgid "User notifications will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1385 templates/InvenTree/settings/sidebar.html:31
+#: common/models.py:1392 templates/InvenTree/settings/sidebar.html:31
 msgid "Barcode Support"
 msgstr ""
 
-#: common/models.py:1386
+#: common/models.py:1393
 #, fuzzy
 #| msgid "Enable barcode scanner support"
 msgid "Enable barcode scanner support in the web interface"
 msgstr "启用条形码扫描支持"
 
-#: common/models.py:1391
+#: common/models.py:1398
 msgid "Barcode Input Delay"
 msgstr ""
 
-#: common/models.py:1392
+#: common/models.py:1399
 msgid "Barcode input processing delay time"
 msgstr ""
 
-#: common/models.py:1398
+#: common/models.py:1405
 msgid "Barcode Webcam Support"
 msgstr ""
 
-#: common/models.py:1399
+#: common/models.py:1406
 msgid "Allow barcode scanning via webcam in browser"
 msgstr ""
 
-#: common/models.py:1404
+#: common/models.py:1411
 #, fuzzy
 #| msgid "Part description"
 msgid "Part Revisions"
 msgstr "商品描述"
 
-#: common/models.py:1405
+#: common/models.py:1412
 #, fuzzy
 #| msgid "Enable internal prices for parts"
 msgid "Enable revision field for Part"
 msgstr "启用内部商品价格"
 
-#: common/models.py:1410
+#: common/models.py:1417
 msgid "IPN Regex"
 msgstr ""
 
-#: common/models.py:1411
+#: common/models.py:1418
 msgid "Regular expression pattern for matching Part IPN"
 msgstr ""
 
-#: common/models.py:1414
+#: common/models.py:1421
 msgid "Allow Duplicate IPN"
 msgstr ""
 
-#: common/models.py:1415
+#: common/models.py:1422
 msgid "Allow multiple parts to share the same IPN"
 msgstr ""
 
-#: common/models.py:1420
+#: common/models.py:1427
 msgid "Allow Editing IPN"
 msgstr ""
 
-#: common/models.py:1421
+#: common/models.py:1428
 msgid "Allow changing the IPN value while editing a part"
 msgstr ""
 
-#: common/models.py:1426
+#: common/models.py:1433
 msgid "Copy Part BOM Data"
 msgstr ""
 
-#: common/models.py:1427
+#: common/models.py:1434
 msgid "Copy BOM data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1432
+#: common/models.py:1439
 msgid "Copy Part Parameter Data"
 msgstr ""
 
-#: common/models.py:1433
+#: common/models.py:1440
 msgid "Copy parameter data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1438
+#: common/models.py:1445
 msgid "Copy Part Test Data"
 msgstr ""
 
-#: common/models.py:1439
+#: common/models.py:1446
 msgid "Copy test data by default when duplicating a part"
 msgstr ""
 
-#: common/models.py:1444
+#: common/models.py:1451
 msgid "Copy Category Parameter Templates"
 msgstr ""
 
-#: common/models.py:1445
+#: common/models.py:1452
 msgid "Copy category parameter templates when creating a part"
 msgstr ""
 
-#: common/models.py:1450 part/admin.py:108 part/models.py:3762
-#: report/models.py:180 stock/serializers.py:95
+#: common/models.py:1457 part/admin.py:108 part/models.py:3771
+#: report/models.py:181 stock/serializers.py:96
 #: templates/js/translated/table_filters.js:139
 #: templates/js/translated/table_filters.js:767
 msgid "Template"
 msgstr "模板"
 
-#: common/models.py:1451
+#: common/models.py:1458
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
+#: common/models.py:1463 part/admin.py:91 part/admin.py:431 part/models.py:1015
 #: templates/js/translated/bom.js:1639
 #: templates/js/translated/table_filters.js:330
 #: templates/js/translated/table_filters.js:721
 msgid "Assembly"
 msgstr "组装"
 
-#: common/models.py:1457
+#: common/models.py:1464
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:1462 part/admin.py:95 part/models.py:1021
+#: common/models.py:1469 part/admin.py:95 part/models.py:1021
 #: templates/js/translated/table_filters.js:729
 msgid "Component"
 msgstr "组件"
 
-#: common/models.py:1463
+#: common/models.py:1470
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:1468 part/admin.py:100 part/models.py:1033
+#: common/models.py:1475 part/admin.py:100 part/models.py:1033
 msgid "Purchaseable"
 msgstr "可购买"
 
-#: common/models.py:1469
+#: common/models.py:1476
 msgid "Parts are purchaseable by default"
 msgstr "商品默认可购买"
 
-#: common/models.py:1474 part/admin.py:104 part/models.py:1039
+#: common/models.py:1481 part/admin.py:104 part/models.py:1039
 #: templates/js/translated/table_filters.js:755
 msgid "Salable"
 msgstr "可销售"
 
-#: common/models.py:1475
+#: common/models.py:1482
 msgid "Parts are salable by default"
 msgstr "商品默认可销售"
 
-#: common/models.py:1480 part/admin.py:113 part/models.py:1027
+#: common/models.py:1487 part/admin.py:113 part/models.py:1027
 #: templates/js/translated/table_filters.js:147
 #: templates/js/translated/table_filters.js:223
 #: templates/js/translated/table_filters.js:771
 msgid "Trackable"
 msgstr "可追踪"
 
-#: common/models.py:1481
+#: common/models.py:1488
 msgid "Parts are trackable by default"
 msgstr "商品默认可跟踪"
 
-#: common/models.py:1486 part/admin.py:117 part/models.py:1049
+#: common/models.py:1493 part/admin.py:117 part/models.py:1049
 #: part/templates/part/part_base.html:154
 #: templates/js/translated/table_filters.js:143
 #: templates/js/translated/table_filters.js:775
 msgid "Virtual"
 msgstr "虚拟"
 
-#: common/models.py:1487
+#: common/models.py:1494
 msgid "Parts are virtual by default"
 msgstr "商品默认是虚拟的"
 
-#: common/models.py:1492
+#: common/models.py:1499
 msgid "Show Import in Views"
 msgstr "视图中显示导入"
 
-#: common/models.py:1493
+#: common/models.py:1500
 msgid "Display the import wizard in some part views"
 msgstr "在一些商品视图中显示导入向导"
 
-#: common/models.py:1498
+#: common/models.py:1505
 msgid "Show related parts"
 msgstr "显示相关商品"
 
-#: common/models.py:1499
+#: common/models.py:1506
 msgid "Display related parts for a part"
 msgstr ""
 
-#: common/models.py:1504
+#: common/models.py:1511
 msgid "Initial Stock Data"
 msgstr ""
 
-#: common/models.py:1505
+#: common/models.py:1512
 msgid "Allow creation of initial stock when adding a new part"
 msgstr ""
 
-#: common/models.py:1510 templates/js/translated/part.js:107
+#: common/models.py:1517 templates/js/translated/part.js:107
 msgid "Initial Supplier Data"
 msgstr ""
 
-#: common/models.py:1512
+#: common/models.py:1519
 msgid "Allow creation of initial supplier data when adding a new part"
 msgstr ""
 
-#: common/models.py:1518
+#: common/models.py:1525
 msgid "Part Name Display Format"
 msgstr ""
 
-#: common/models.py:1519
+#: common/models.py:1526
 msgid "Format to display the part name"
 msgstr ""
 
-#: common/models.py:1525
+#: common/models.py:1532
 msgid "Part Category Default Icon"
 msgstr ""
 
-#: common/models.py:1526
+#: common/models.py:1533
 msgid "Part category default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1530
+#: common/models.py:1537
 #, fuzzy
 #| msgid "Parameter units"
 msgid "Enforce Parameter Units"
 msgstr "参数单位"
 
-#: common/models.py:1532
+#: common/models.py:1539
 msgid "If units are provided, parameter values must match the specified units"
 msgstr ""
 
-#: common/models.py:1538
+#: common/models.py:1545
 msgid "Minimum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1540
+#: common/models.py:1547
 msgid "Minimum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1546
+#: common/models.py:1553
 msgid "Maximum Pricing Decimal Places"
 msgstr ""
 
-#: common/models.py:1548
+#: common/models.py:1555
 msgid "Maximum number of decimal places to display when rendering pricing data"
 msgstr ""
 
-#: common/models.py:1554
+#: common/models.py:1561
 msgid "Use Supplier Pricing"
 msgstr ""
 
-#: common/models.py:1556
+#: common/models.py:1563
 msgid "Include supplier price breaks in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1562
+#: common/models.py:1569
 msgid "Purchase History Override"
 msgstr ""
 
-#: common/models.py:1564
+#: common/models.py:1571
 msgid "Historical purchase order pricing overrides supplier price breaks"
 msgstr ""
 
-#: common/models.py:1570
+#: common/models.py:1577
 msgid "Use Stock Item Pricing"
 msgstr ""
 
-#: common/models.py:1572
+#: common/models.py:1579
 msgid "Use pricing from manually entered stock data for pricing calculations"
 msgstr ""
 
-#: common/models.py:1578
+#: common/models.py:1585
 msgid "Stock Item Pricing Age"
 msgstr ""
 
-#: common/models.py:1580
+#: common/models.py:1587
 msgid "Exclude stock items older than this number of days from pricing calculations"
 msgstr ""
 
-#: common/models.py:1587
+#: common/models.py:1594
 msgid "Use Variant Pricing"
 msgstr ""
 
-#: common/models.py:1588
+#: common/models.py:1595
 msgid "Include variant pricing in overall pricing calculations"
 msgstr ""
 
-#: common/models.py:1593
+#: common/models.py:1600
 msgid "Active Variants Only"
 msgstr ""
 
-#: common/models.py:1595
+#: common/models.py:1602
 msgid "Only use active variant parts for calculating variant pricing"
 msgstr ""
 
-#: common/models.py:1601
+#: common/models.py:1608
 msgid "Pricing Rebuild Interval"
 msgstr ""
 
-#: common/models.py:1603
+#: common/models.py:1610
 msgid "Number of days before part pricing is automatically updated"
 msgstr ""
 
-#: common/models.py:1610
+#: common/models.py:1617
 msgid "Internal Prices"
 msgstr "内部价格"
 
-#: common/models.py:1611
+#: common/models.py:1618
 msgid "Enable internal prices for parts"
 msgstr "启用内部商品价格"
 
-#: common/models.py:1616
+#: common/models.py:1623
 msgid "Internal Price Override"
 msgstr ""
 
-#: common/models.py:1618
+#: common/models.py:1625
 msgid "If available, internal prices override price range calculations"
 msgstr ""
 
-#: common/models.py:1624
+#: common/models.py:1631
 msgid "Enable label printing"
 msgstr ""
 
-#: common/models.py:1625
+#: common/models.py:1632
 msgid "Enable label printing from the web interface"
 msgstr ""
 
-#: common/models.py:1630
+#: common/models.py:1637
 msgid "Label Image DPI"
 msgstr ""
 
-#: common/models.py:1632
+#: common/models.py:1639
 msgid "DPI resolution when generating image files to supply to label printing plugins"
 msgstr ""
 
-#: common/models.py:1638
+#: common/models.py:1645
 msgid "Enable Reports"
 msgstr ""
 
-#: common/models.py:1639
+#: common/models.py:1646
 msgid "Enable generation of reports"
 msgstr ""
 
-#: common/models.py:1644 templates/stats.html:25
+#: common/models.py:1651 templates/stats.html:25
 msgid "Debug Mode"
 msgstr "调试模式"
 
-#: common/models.py:1645
+#: common/models.py:1652
 msgid "Generate reports in debug mode (HTML output)"
 msgstr "在调试模式生成报告(HTML输出)"
 
-#: common/models.py:1650 plugin/builtin/labels/label_sheet.py:28
-#: report/models.py:201
+#: common/models.py:1657
+#, fuzzy
+#| msgid "No Reports Found"
+msgid "Log Report Errors"
+msgstr "没有找到报表"
+
+#: common/models.py:1658
+msgid "Log errors which occur when generating reports"
+msgstr ""
+
+#: common/models.py:1663 plugin/builtin/labels/label_sheet.py:28
+#: report/models.py:202
 msgid "Page Size"
 msgstr "页面大小"
 
-#: common/models.py:1651
+#: common/models.py:1664
 msgid "Default page size for PDF reports"
 msgstr "PDF 报表默认页面大小"
 
-#: common/models.py:1656
+#: common/models.py:1669
 msgid "Enable Test Reports"
 msgstr ""
 
-#: common/models.py:1657
+#: common/models.py:1670
 msgid "Enable generation of test reports"
 msgstr "启用生成测试报表"
 
-#: common/models.py:1662
+#: common/models.py:1675
 msgid "Attach Test Reports"
 msgstr ""
 
-#: common/models.py:1664
+#: common/models.py:1677
 msgid "When printing a Test Report, attach a copy of the Test Report to the associated Stock Item"
 msgstr ""
 
-#: common/models.py:1670
+#: common/models.py:1683
 msgid "Globally Unique Serials"
 msgstr ""
 
-#: common/models.py:1671
+#: common/models.py:1684
 msgid "Serial numbers for stock items must be globally unique"
 msgstr ""
 
-#: common/models.py:1676
+#: common/models.py:1689
 msgid "Autofill Serial Numbers"
 msgstr ""
 
-#: common/models.py:1677
+#: common/models.py:1690
 msgid "Autofill serial numbers in forms"
 msgstr ""
 
-#: common/models.py:1682
+#: common/models.py:1695
 msgid "Delete Depleted Stock"
 msgstr ""
 
-#: common/models.py:1684
+#: common/models.py:1697
 msgid "Determines default behaviour when a stock item is depleted"
 msgstr ""
 
-#: common/models.py:1690
+#: common/models.py:1703
 msgid "Batch Code Template"
 msgstr ""
 
-#: common/models.py:1692
+#: common/models.py:1705
 msgid "Template for generating default batch codes for stock items"
 msgstr ""
 
-#: common/models.py:1697
+#: common/models.py:1710
 msgid "Stock Expiry"
 msgstr "库存到期"
 
-#: common/models.py:1698
+#: common/models.py:1711
 msgid "Enable stock expiry functionality"
 msgstr "启用库存到期功能"
 
-#: common/models.py:1703
+#: common/models.py:1716
 msgid "Sell Expired Stock"
 msgstr "销售过期库存"
 
-#: common/models.py:1704
+#: common/models.py:1717
 msgid "Allow sale of expired stock"
 msgstr "允许销售过期库存"
 
-#: common/models.py:1709
+#: common/models.py:1722
 msgid "Stock Stale Time"
 msgstr ""
 
-#: common/models.py:1711
+#: common/models.py:1724
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
 
-#: common/models.py:1718
+#: common/models.py:1731
 msgid "Build Expired Stock"
 msgstr ""
 
-#: common/models.py:1719
+#: common/models.py:1732
 msgid "Allow building with expired stock"
 msgstr ""
 
-#: common/models.py:1724
+#: common/models.py:1737
 msgid "Stock Ownership Control"
 msgstr "库存所有权控制"
 
-#: common/models.py:1725
+#: common/models.py:1738
 msgid "Enable ownership control over stock locations and items"
 msgstr ""
 
-#: common/models.py:1730
+#: common/models.py:1743
 msgid "Stock Location Default Icon"
 msgstr ""
 
-#: common/models.py:1731
+#: common/models.py:1744
 msgid "Stock location default icon (empty means no icon)"
 msgstr ""
 
-#: common/models.py:1735
+#: common/models.py:1748
 #, fuzzy
 #| msgid "Select Stock Items"
 msgid "Show Installed Stock Items"
 msgstr "选择库存项"
 
-#: common/models.py:1736
+#: common/models.py:1749
 msgid "Display installed stock items in stock tables"
 msgstr ""
 
-#: common/models.py:1741
+#: common/models.py:1754
 msgid "Build Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1743
+#: common/models.py:1756
 msgid "Required pattern for generating Build Order reference field"
 msgstr ""
 
-#: common/models.py:1749
+#: common/models.py:1762
 #, fuzzy
 #| msgid "Sales Orders"
 msgid "Enable Return Orders"
 msgstr "销售订单"
 
-#: common/models.py:1750
+#: common/models.py:1763
 msgid "Enable return order functionality in the user interface"
 msgstr ""
 
-#: common/models.py:1755
+#: common/models.py:1768
 #, fuzzy
 #| msgid "Build Order Reference"
 msgid "Return Order Reference Pattern"
 msgstr "相关生产订单"
 
-#: common/models.py:1757
+#: common/models.py:1770
 msgid "Required pattern for generating Return Order reference field"
 msgstr ""
 
-#: common/models.py:1763
+#: common/models.py:1776
 #, fuzzy
 #| msgid "Complete Build Order"
 msgid "Edit Completed Return Orders"
 msgstr "生产订单完成"
 
-#: common/models.py:1765
+#: common/models.py:1778
 msgid "Allow editing of return orders after they have been completed"
 msgstr ""
 
-#: common/models.py:1771
+#: common/models.py:1784
 msgid "Sales Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1773
+#: common/models.py:1786
 msgid "Required pattern for generating Sales Order reference field"
 msgstr ""
 
-#: common/models.py:1779
+#: common/models.py:1792
 msgid "Sales Order Default Shipment"
 msgstr ""
 
-#: common/models.py:1780
+#: common/models.py:1793
 msgid "Enable creation of default shipment with sales orders"
 msgstr ""
 
-#: common/models.py:1785
+#: common/models.py:1798
 msgid "Edit Completed Sales Orders"
 msgstr ""
 
-#: common/models.py:1787
+#: common/models.py:1800
 msgid "Allow editing of sales orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1793
+#: common/models.py:1806
 msgid "Purchase Order Reference Pattern"
 msgstr ""
 
-#: common/models.py:1795
+#: common/models.py:1808
 msgid "Required pattern for generating Purchase Order reference field"
 msgstr ""
 
-#: common/models.py:1801
+#: common/models.py:1814
 msgid "Edit Completed Purchase Orders"
 msgstr ""
 
-#: common/models.py:1803
+#: common/models.py:1816
 msgid "Allow editing of purchase orders after they have been shipped or completed"
 msgstr ""
 
-#: common/models.py:1809
+#: common/models.py:1822
 #, fuzzy
 #| msgid "Create Purchase Order"
 msgid "Auto Complete Purchase Orders"
 msgstr "创建采购订单"
 
-#: common/models.py:1811
+#: common/models.py:1824
 msgid "Automatically mark purchase orders as complete when all line items are received"
 msgstr ""
 
-#: common/models.py:1818
+#: common/models.py:1831
 msgid "Enable password forgot"
 msgstr ""
 
-#: common/models.py:1819
+#: common/models.py:1832
 msgid "Enable password forgot function on the login pages"
 msgstr ""
 
-#: common/models.py:1824
+#: common/models.py:1837
 msgid "Enable registration"
 msgstr ""
 
-#: common/models.py:1825
+#: common/models.py:1838
 msgid "Enable self-registration for users on the login pages"
 msgstr ""
 
-#: common/models.py:1830
+#: common/models.py:1843
 msgid "Enable SSO"
 msgstr ""
 
-#: common/models.py:1831
+#: common/models.py:1844
 msgid "Enable SSO on the login pages"
 msgstr ""
 
-#: common/models.py:1836
+#: common/models.py:1849
 msgid "Enable SSO registration"
 msgstr ""
 
-#: common/models.py:1838
+#: common/models.py:1851
 msgid "Enable self-registration via SSO for users on the login pages"
 msgstr ""
 
-#: common/models.py:1844
+#: common/models.py:1857
 msgid "Email required"
 msgstr ""
 
-#: common/models.py:1845
+#: common/models.py:1858
 msgid "Require user to supply mail on signup"
 msgstr ""
 
-#: common/models.py:1850
+#: common/models.py:1863
 msgid "Auto-fill SSO users"
 msgstr ""
 
-#: common/models.py:1852
+#: common/models.py:1865
 msgid "Automatically fill out user-details from SSO account-data"
 msgstr ""
 
-#: common/models.py:1858
+#: common/models.py:1871
 msgid "Mail twice"
 msgstr ""
 
-#: common/models.py:1859
+#: common/models.py:1872
 msgid "On signup ask users twice for their mail"
 msgstr ""
 
-#: common/models.py:1864
+#: common/models.py:1877
 msgid "Password twice"
 msgstr ""
 
-#: common/models.py:1865
+#: common/models.py:1878
 msgid "On signup ask users twice for their password"
 msgstr ""
 
-#: common/models.py:1870
+#: common/models.py:1883
 msgid "Allowed domains"
 msgstr ""
 
-#: common/models.py:1872
+#: common/models.py:1885
 msgid "Restrict signup to certain domains (comma-separated, starting with @)"
 msgstr ""
 
-#: common/models.py:1878
+#: common/models.py:1891
 msgid "Group on signup"
 msgstr ""
 
-#: common/models.py:1879
+#: common/models.py:1892
 msgid "Group to which new users are assigned on registration"
 msgstr ""
 
-#: common/models.py:1884
+#: common/models.py:1897
 msgid "Enforce MFA"
 msgstr ""
 
-#: common/models.py:1885
+#: common/models.py:1898
 msgid "Users must use multifactor security."
 msgstr ""
 
-#: common/models.py:1890
+#: common/models.py:1903
 msgid "Check plugins on startup"
 msgstr ""
 
-#: common/models.py:1892
+#: common/models.py:1905
 msgid "Check that all plugins are installed on startup - enable in container environments"
 msgstr ""
 
-#: common/models.py:1900
+#: common/models.py:1913
 msgid "Check for plugin updates"
 msgstr ""
 
-#: common/models.py:1901
+#: common/models.py:1914
 msgid "Enable periodic checks for updates to installed plugins"
 msgstr ""
 
-#: common/models.py:1907
+#: common/models.py:1920
 msgid "Enable URL integration"
 msgstr ""
 
-#: common/models.py:1908
+#: common/models.py:1921
 msgid "Enable plugins to add URL routes"
 msgstr ""
 
-#: common/models.py:1914
+#: common/models.py:1927
 msgid "Enable navigation integration"
 msgstr ""
 
-#: common/models.py:1915
+#: common/models.py:1928
 msgid "Enable plugins to integrate into navigation"
 msgstr ""
 
-#: common/models.py:1921
+#: common/models.py:1934
 msgid "Enable app integration"
 msgstr ""
 
-#: common/models.py:1922
+#: common/models.py:1935
 msgid "Enable plugins to add apps"
 msgstr ""
 
-#: common/models.py:1928
+#: common/models.py:1941
 msgid "Enable schedule integration"
 msgstr ""
 
-#: common/models.py:1929
+#: common/models.py:1942
 msgid "Enable plugins to run scheduled tasks"
 msgstr ""
 
-#: common/models.py:1935
+#: common/models.py:1948
 msgid "Enable event integration"
 msgstr ""
 
-#: common/models.py:1936
+#: common/models.py:1949
 msgid "Enable plugins to respond to internal events"
 msgstr ""
 
-#: common/models.py:1942
+#: common/models.py:1955
 #, fuzzy
 #| msgid "Sales Orders"
 msgid "Enable project codes"
 msgstr "销售订单"
 
-#: common/models.py:1943
+#: common/models.py:1956
 msgid "Enable project codes for tracking projects"
 msgstr ""
 
-#: common/models.py:1948
+#: common/models.py:1961
 msgid "Stocktake Functionality"
 msgstr ""
 
-#: common/models.py:1950
+#: common/models.py:1963
 msgid "Enable stocktake functionality for recording stock levels and calculating stock value"
 msgstr ""
 
-#: common/models.py:1956
+#: common/models.py:1969
 #, fuzzy
 #| msgid "Exclude Location"
 msgid "Exclude External Locations"
 msgstr "排除地点"
 
-#: common/models.py:1958
+#: common/models.py:1971
 #, fuzzy
 #| msgid "Exclude stock items from this selected location"
 msgid "Exclude stock items in external locations from stocktake calculations"
 msgstr "从该选定的仓储地点排除库存项"
 
-#: common/models.py:1964
+#: common/models.py:1977
 msgid "Automatic Stocktake Period"
 msgstr ""
 
-#: common/models.py:1966
+#: common/models.py:1979
 msgid "Number of days between automatic stocktake recording (set to zero to disable)"
 msgstr ""
 
-#: common/models.py:1972
+#: common/models.py:1985
 msgid "Report Deletion Interval"
 msgstr ""
 
-#: common/models.py:1974
+#: common/models.py:1987
 msgid "Stocktake reports will be deleted after specified number of days"
 msgstr ""
 
-#: common/models.py:1981
+#: common/models.py:1994
 msgid "Display Users full names"
 msgstr ""
 
-#: common/models.py:1982
+#: common/models.py:1995
 msgid "Display Users full names instead of usernames"
 msgstr ""
 
-#: common/models.py:1987
+#: common/models.py:2000
 msgid "Block Until Tests Pass"
 msgstr ""
 
-#: common/models.py:1989
+#: common/models.py:2002
 msgid "Prevent build outputs from being completed until all required tests pass"
 msgstr ""
 
-#: common/models.py:2002 common/models.py:2402
+#: common/models.py:2015 common/models.py:2415
 msgid "Settings key (must be unique - case insensitive"
 msgstr ""
 
-#: common/models.py:2043
+#: common/models.py:2056
 #, fuzzy
 #| msgid "Build to allocate parts"
 msgid "Hide inactive parts"
 msgstr "生产以分配部件"
 
-#: common/models.py:2045
+#: common/models.py:2058
 msgid "Hide inactive parts in results displayed on the homepage"
 msgstr ""
 
-#: common/models.py:2051
+#: common/models.py:2064
 msgid "Show subscribed parts"
 msgstr ""
 
-#: common/models.py:2052
+#: common/models.py:2065
 msgid "Show subscribed parts on the homepage"
 msgstr ""
 
-#: common/models.py:2057
+#: common/models.py:2070
 msgid "Show subscribed categories"
 msgstr ""
 
-#: common/models.py:2058
+#: common/models.py:2071
 msgid "Show subscribed part categories on the homepage"
 msgstr ""
 
-#: common/models.py:2063
+#: common/models.py:2076
 msgid "Show latest parts"
 msgstr "显示最近商品"
 
-#: common/models.py:2064
+#: common/models.py:2077
 msgid "Show latest parts on the homepage"
 msgstr "在主页上显示最近商品"
 
-#: common/models.py:2069
+#: common/models.py:2082
 msgid "Show unvalidated BOMs"
 msgstr ""
 
-#: common/models.py:2070
+#: common/models.py:2083
 msgid "Show BOMs that await validation on the homepage"
 msgstr ""
 
-#: common/models.py:2075
+#: common/models.py:2088
 msgid "Show recent stock changes"
 msgstr ""
 
-#: common/models.py:2076
+#: common/models.py:2089
 msgid "Show recently changed stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2081
+#: common/models.py:2094
 msgid "Show low stock"
 msgstr ""
 
-#: common/models.py:2082
+#: common/models.py:2095
 msgid "Show low stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2087
+#: common/models.py:2100
 msgid "Show depleted stock"
 msgstr ""
 
-#: common/models.py:2088
+#: common/models.py:2101
 msgid "Show depleted stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2093
+#: common/models.py:2106
 msgid "Show needed stock"
 msgstr ""
 
-#: common/models.py:2094
+#: common/models.py:2107
 msgid "Show stock items needed for builds on the homepage"
 msgstr ""
 
-#: common/models.py:2099
+#: common/models.py:2112
 msgid "Show expired stock"
 msgstr ""
 
-#: common/models.py:2100
+#: common/models.py:2113
 msgid "Show expired stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2105
+#: common/models.py:2118
 msgid "Show stale stock"
 msgstr ""
 
-#: common/models.py:2106
+#: common/models.py:2119
 msgid "Show stale stock items on the homepage"
 msgstr ""
 
-#: common/models.py:2111
+#: common/models.py:2124
 msgid "Show pending builds"
 msgstr ""
 
-#: common/models.py:2112
+#: common/models.py:2125
 msgid "Show pending builds on the homepage"
 msgstr ""
 
-#: common/models.py:2117
+#: common/models.py:2130
 msgid "Show overdue builds"
 msgstr "显示逾期生产"
 
-#: common/models.py:2118
+#: common/models.py:2131
 msgid "Show overdue builds on the homepage"
 msgstr "在主页上显示逾期的生产"
 
-#: common/models.py:2123
+#: common/models.py:2136
 msgid "Show outstanding POs"
 msgstr ""
 
-#: common/models.py:2124
+#: common/models.py:2137
 msgid "Show outstanding POs on the homepage"
 msgstr ""
 
-#: common/models.py:2129
+#: common/models.py:2142
 msgid "Show overdue POs"
 msgstr ""
 
-#: common/models.py:2130
+#: common/models.py:2143
 msgid "Show overdue POs on the homepage"
 msgstr ""
 
-#: common/models.py:2135
+#: common/models.py:2148
 msgid "Show outstanding SOs"
 msgstr ""
 
-#: common/models.py:2136
+#: common/models.py:2149
 msgid "Show outstanding SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2141
+#: common/models.py:2154
 msgid "Show overdue SOs"
 msgstr ""
 
-#: common/models.py:2142
+#: common/models.py:2155
 msgid "Show overdue SOs on the homepage"
 msgstr ""
 
-#: common/models.py:2147
+#: common/models.py:2160
 msgid "Show pending SO shipments"
 msgstr ""
 
-#: common/models.py:2148
+#: common/models.py:2161
 #, fuzzy
 #| msgid "Show latest parts on the homepage"
 msgid "Show pending SO shipments on the homepage"
 msgstr "在主页上显示最近商品"
 
-#: common/models.py:2153
+#: common/models.py:2166
 msgid "Show News"
 msgstr ""
 
-#: common/models.py:2154
+#: common/models.py:2167
 msgid "Show news on the homepage"
 msgstr ""
 
-#: common/models.py:2159
+#: common/models.py:2172
 msgid "Inline label display"
 msgstr "内嵌标签显示"
 
-#: common/models.py:2161
+#: common/models.py:2174
 msgid "Display PDF labels in the browser, instead of downloading as a file"
 msgstr "在浏览器中显示 PDF 标签,而不是以文件形式下载"
 
-#: common/models.py:2167
+#: common/models.py:2180
 msgid "Default label printer"
 msgstr ""
 
-#: common/models.py:2169
+#: common/models.py:2182
 msgid "Configure which label printer should be selected by default"
 msgstr ""
 
-#: common/models.py:2175
+#: common/models.py:2188
 msgid "Inline report display"
 msgstr ""
 
-#: common/models.py:2177
+#: common/models.py:2190
 msgid "Display PDF reports in the browser, instead of downloading as a file"
 msgstr "在浏览器中显示 PDF 报告,而不是以文件形式下载"
 
-#: common/models.py:2183
+#: common/models.py:2196
 msgid "Search Parts"
 msgstr ""
 
-#: common/models.py:2184
+#: common/models.py:2197
 msgid "Display parts in search preview window"
 msgstr ""
 
-#: common/models.py:2189
+#: common/models.py:2202
 msgid "Search Supplier Parts"
 msgstr ""
 
-#: common/models.py:2190
+#: common/models.py:2203
 msgid "Display supplier parts in search preview window"
 msgstr ""
 
-#: common/models.py:2195
+#: common/models.py:2208
 msgid "Search Manufacturer Parts"
 msgstr ""
 
-#: common/models.py:2196
+#: common/models.py:2209
 msgid "Display manufacturer parts in search preview window"
 msgstr ""
 
-#: common/models.py:2201
+#: common/models.py:2214
 msgid "Hide Inactive Parts"
 msgstr ""
 
-#: common/models.py:2202
+#: common/models.py:2215
 msgid "Excluded inactive parts from search preview window"
 msgstr ""
 
-#: common/models.py:2207
+#: common/models.py:2220
 msgid "Search Categories"
 msgstr ""
 
-#: common/models.py:2208
+#: common/models.py:2221
 msgid "Display part categories in search preview window"
 msgstr ""
 
-#: common/models.py:2213
+#: common/models.py:2226
 msgid "Search Stock"
 msgstr ""
 
-#: common/models.py:2214
+#: common/models.py:2227
 msgid "Display stock items in search preview window"
 msgstr ""
 
-#: common/models.py:2219
+#: common/models.py:2232
 msgid "Hide Unavailable Stock Items"
 msgstr ""
 
-#: common/models.py:2221
+#: common/models.py:2234
 msgid "Exclude stock items which are not available from the search preview window"
 msgstr ""
 
-#: common/models.py:2227
+#: common/models.py:2240
 msgid "Search Locations"
 msgstr ""
 
-#: common/models.py:2228
+#: common/models.py:2241
 msgid "Display stock locations in search preview window"
 msgstr ""
 
-#: common/models.py:2233
+#: common/models.py:2246
 msgid "Search Companies"
 msgstr ""
 
-#: common/models.py:2234
+#: common/models.py:2247
 msgid "Display companies in search preview window"
 msgstr ""
 
-#: common/models.py:2239
+#: common/models.py:2252
 msgid "Search Build Orders"
 msgstr ""
 
-#: common/models.py:2240
+#: common/models.py:2253
 msgid "Display build orders in search preview window"
 msgstr ""
 
-#: common/models.py:2245
+#: common/models.py:2258
 msgid "Search Purchase Orders"
 msgstr ""
 
-#: common/models.py:2246
+#: common/models.py:2259
 msgid "Display purchase orders in search preview window"
 msgstr ""
 
-#: common/models.py:2251
+#: common/models.py:2264
 msgid "Exclude Inactive Purchase Orders"
 msgstr ""
 
-#: common/models.py:2253
+#: common/models.py:2266
 msgid "Exclude inactive purchase orders from search preview window"
 msgstr ""
 
-#: common/models.py:2259
+#: common/models.py:2272
 msgid "Search Sales Orders"
 msgstr ""
 
-#: common/models.py:2260
+#: common/models.py:2273
 msgid "Display sales orders in search preview window"
 msgstr ""
 
-#: common/models.py:2265
+#: common/models.py:2278
 msgid "Exclude Inactive Sales Orders"
 msgstr ""
 
-#: common/models.py:2267
+#: common/models.py:2280
 msgid "Exclude inactive sales orders from search preview window"
 msgstr ""
 
-#: common/models.py:2273
+#: common/models.py:2286
 #, fuzzy
 #| msgid "Purchase Orders"
 msgid "Search Return Orders"
 msgstr "采购订单"
 
-#: common/models.py:2274
+#: common/models.py:2287
 msgid "Display return orders in search preview window"
 msgstr ""
 
-#: common/models.py:2279
+#: common/models.py:2292
 msgid "Exclude Inactive Return Orders"
 msgstr ""
 
-#: common/models.py:2281
+#: common/models.py:2294
 msgid "Exclude inactive return orders from search preview window"
 msgstr ""
 
-#: common/models.py:2287
+#: common/models.py:2300
 msgid "Search Preview Results"
 msgstr "搜索预览结果"
 
-#: common/models.py:2289
+#: common/models.py:2302
 msgid "Number of results to show in each section of the search preview window"
 msgstr ""
 
-#: common/models.py:2295
+#: common/models.py:2308
 #, fuzzy
 #| msgid "Search"
 msgid "Regex Search"
 msgstr "搜索"
 
-#: common/models.py:2296
+#: common/models.py:2309
 msgid "Enable regular expressions in search queries"
 msgstr ""
 
-#: common/models.py:2301
+#: common/models.py:2314
 msgid "Whole Word Search"
 msgstr ""
 
-#: common/models.py:2302
+#: common/models.py:2315
 msgid "Search queries return results for whole word matches"
 msgstr ""
 
-#: common/models.py:2307
+#: common/models.py:2320
 msgid "Show Quantity in Forms"
 msgstr "在表格中显示数量"
 
-#: common/models.py:2308
+#: common/models.py:2321
 msgid "Display available part quantity in some forms"
 msgstr "在某些表格中显示可用的商品数量"
 
-#: common/models.py:2313
+#: common/models.py:2326
 msgid "Escape Key Closes Forms"
 msgstr ""
 
-#: common/models.py:2314
+#: common/models.py:2327
 msgid "Use the escape key to close modal forms"
 msgstr ""
 
-#: common/models.py:2319
+#: common/models.py:2332
 msgid "Fixed Navbar"
 msgstr ""
 
-#: common/models.py:2320
+#: common/models.py:2333
 msgid "The navbar position is fixed to the top of the screen"
 msgstr ""
 
-#: common/models.py:2325
+#: common/models.py:2338
 msgid "Date Format"
 msgstr ""
 
-#: common/models.py:2326
+#: common/models.py:2339
 msgid "Preferred format for displaying dates"
 msgstr ""
 
-#: common/models.py:2339 part/templates/part/detail.html:41
+#: common/models.py:2352 part/templates/part/detail.html:41
 msgid "Part Scheduling"
 msgstr ""
 
-#: common/models.py:2340
+#: common/models.py:2353
 msgid "Display part scheduling information"
 msgstr ""
 
-#: common/models.py:2345 part/templates/part/detail.html:62
+#: common/models.py:2358 part/templates/part/detail.html:62
 msgid "Part Stocktake"
 msgstr ""
 
-#: common/models.py:2347
+#: common/models.py:2360
 msgid "Display part stocktake information (if stocktake functionality is enabled)"
 msgstr ""
 
-#: common/models.py:2353
+#: common/models.py:2366
 msgid "Table String Length"
 msgstr ""
 
-#: common/models.py:2355
+#: common/models.py:2368
 msgid "Maximum length limit for strings displayed in table views"
 msgstr ""
 
-#: common/models.py:2361
+#: common/models.py:2374
 #, fuzzy
 #| msgid "Select Label Template"
 msgid "Default part label template"
 msgstr "选择标签模板"
 
-#: common/models.py:2362
+#: common/models.py:2375
 msgid "The part label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2367
+#: common/models.py:2380
 #, fuzzy
 #| msgid "stock items selected"
 msgid "Default stock item template"
 msgstr "已选择库存项"
 
-#: common/models.py:2369
+#: common/models.py:2382
 msgid "The stock item label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2375
+#: common/models.py:2388
 #, fuzzy
 #| msgid "No stock location set"
 msgid "Default stock location label template"
 msgstr "未设置仓储地点"
 
-#: common/models.py:2377
+#: common/models.py:2390
 msgid "The stock location label template to be automatically selected"
 msgstr ""
 
-#: common/models.py:2383
+#: common/models.py:2396
 msgid "Receive error reports"
 msgstr ""
 
-#: common/models.py:2384
+#: common/models.py:2397
 msgid "Receive notifications for system errors"
 msgstr ""
 
-#: common/models.py:2389
+#: common/models.py:2402
 msgid "Last used printing machines"
 msgstr ""
 
-#: common/models.py:2390
+#: common/models.py:2403
 msgid "Save the last used printing machines for a user"
 msgstr ""
 
-#: common/models.py:2433
+#: common/models.py:2446
 msgid "Price break quantity"
 msgstr ""
 
-#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
+#: common/models.py:2453 company/serializers.py:486 order/admin.py:42
 #: order/models.py:1321 order/models.py:2226
 #: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
 #: templates/js/translated/pricing.js:621
@@ -3640,23 +3650,23 @@ msgstr ""
 msgid "Price"
 msgstr "价格"
 
-#: common/models.py:2441
+#: common/models.py:2454
 msgid "Unit price at specified quantity"
 msgstr ""
 
-#: common/models.py:2612 common/models.py:2797
+#: common/models.py:2625 common/models.py:2810
 msgid "Endpoint"
 msgstr ""
 
-#: common/models.py:2613
+#: common/models.py:2626
 msgid "Endpoint at which this webhook is received"
 msgstr ""
 
-#: common/models.py:2623
+#: common/models.py:2636
 msgid "Name for this webhook"
 msgstr ""
 
-#: common/models.py:2627 machine/models.py:39 part/admin.py:88
+#: common/models.py:2640 machine/models.py:39 part/admin.py:88
 #: part/models.py:1044 plugin/models.py:56
 #: templates/js/translated/table_filters.js:135
 #: templates/js/translated/table_filters.js:219
@@ -3666,101 +3676,101 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: common/models.py:2627
+#: common/models.py:2640
 msgid "Is this webhook active"
 msgstr ""
 
-#: common/models.py:2643 users/models.py:148
+#: common/models.py:2656 users/models.py:148
 msgid "Token"
 msgstr "令牌"
 
-#: common/models.py:2644
+#: common/models.py:2657
 msgid "Token for access"
 msgstr ""
 
-#: common/models.py:2652
+#: common/models.py:2665
 msgid "Secret"
 msgstr ""
 
-#: common/models.py:2653
+#: common/models.py:2666
 msgid "Shared secret for HMAC"
 msgstr ""
 
-#: common/models.py:2761
+#: common/models.py:2774
 msgid "Message ID"
 msgstr ""
 
-#: common/models.py:2762
+#: common/models.py:2775
 msgid "Unique identifier for this message"
 msgstr ""
 
-#: common/models.py:2770
+#: common/models.py:2783
 msgid "Host"
 msgstr ""
 
-#: common/models.py:2771
+#: common/models.py:2784
 msgid "Host from which this message was received"
 msgstr ""
 
-#: common/models.py:2779
+#: common/models.py:2792
 msgid "Header"
 msgstr ""
 
-#: common/models.py:2780
+#: common/models.py:2793
 msgid "Header of this message"
 msgstr ""
 
-#: common/models.py:2787
+#: common/models.py:2800
 msgid "Body"
 msgstr ""
 
-#: common/models.py:2788
+#: common/models.py:2801
 msgid "Body of this message"
 msgstr ""
 
-#: common/models.py:2798
+#: common/models.py:2811
 msgid "Endpoint on which this message was received"
 msgstr ""
 
-#: common/models.py:2803
+#: common/models.py:2816
 msgid "Worked on"
 msgstr ""
 
-#: common/models.py:2804
+#: common/models.py:2817
 msgid "Was the work on this message finished?"
 msgstr ""
 
-#: common/models.py:2930
+#: common/models.py:2943
 msgid "Id"
 msgstr ""
 
-#: common/models.py:2932 templates/js/translated/company.js:955
+#: common/models.py:2945 templates/js/translated/company.js:955
 #: templates/js/translated/news.js:44
 msgid "Title"
 msgstr ""
 
-#: common/models.py:2936 templates/js/translated/news.js:60
+#: common/models.py:2949 templates/js/translated/news.js:60
 msgid "Published"
 msgstr ""
 
-#: common/models.py:2938 templates/InvenTree/settings/plugin_settings.html:32
+#: common/models.py:2951 templates/InvenTree/settings/plugin_settings.html:32
 #: templates/js/translated/news.js:56 templates/js/translated/plugin.js:103
 msgid "Author"
 msgstr ""
 
-#: common/models.py:2940 templates/js/translated/news.js:52
+#: common/models.py:2953 templates/js/translated/news.js:52
 msgid "Summary"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Read"
 msgstr ""
 
-#: common/models.py:2943
+#: common/models.py:2956
 msgid "Was this news item read?"
 msgstr ""
 
-#: common/models.py:2960 company/models.py:155 part/models.py:928
+#: common/models.py:2973 company/models.py:155 part/models.py:928
 #: report/templates/report/inventree_bill_of_materials_report.html:126
 #: report/templates/report/inventree_bill_of_materials_report.html:148
 #: report/templates/report/inventree_return_order_report_base.html:35
@@ -3770,41 +3780,41 @@ msgstr ""
 msgid "Image"
 msgstr "图片"
 
-#: common/models.py:2960
+#: common/models.py:2973
 #, fuzzy
 #| msgid "Image"
 msgid "Image file"
 msgstr "图片"
 
-#: common/models.py:3002
+#: common/models.py:3015
 #, fuzzy
 #| msgid "Must be a valid number"
 msgid "Unit name must be a valid identifier"
 msgstr "必须是有效数字"
 
-#: common/models.py:3021
+#: common/models.py:3034
 #, fuzzy
 #| msgid "Part name"
 msgid "Unit name"
 msgstr "商品名称"
 
-#: common/models.py:3028 templates/InvenTree/settings/settings_staff_js.html:75
+#: common/models.py:3041 templates/InvenTree/settings/settings_staff_js.html:75
 msgid "Symbol"
 msgstr ""
 
-#: common/models.py:3029
+#: common/models.py:3042
 #, fuzzy
 #| msgid "Optional Items"
 msgid "Optional unit symbol"
 msgstr "可选项目"
 
-#: common/models.py:3036 templates/InvenTree/settings/settings_staff_js.html:71
+#: common/models.py:3049 templates/InvenTree/settings/settings_staff_js.html:71
 #, fuzzy
 #| msgid "Destination"
 msgid "Definition"
 msgstr "目的地"
 
-#: common/models.py:3037
+#: common/models.py:3050
 msgid "Unit definition"
 msgstr ""
 
@@ -4142,7 +4152,7 @@ msgid "Link to address information (external)"
 msgstr "描述 (可选)"
 
 #: company/models.py:484 company/models.py:785 stock/models.py:754
-#: stock/serializers.py:251 stock/templates/stock/item_base.html:142
+#: stock/serializers.py:252 stock/templates/stock/item_base.html:142
 #: templates/js/translated/bom.js:622
 msgid "Base Part"
 msgstr ""
@@ -4153,7 +4163,7 @@ msgstr "选择商品"
 
 #: company/models.py:495 company/templates/company/company_base.html:76
 #: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:505
+#: company/templates/company/supplier_part.html:145 part/serializers.py:515
 #: stock/templates/stock/item_base.html:207
 #: templates/js/translated/company.js:506
 #: templates/js/translated/company.js:1108
@@ -4168,7 +4178,7 @@ msgid "Select manufacturer"
 msgstr "选择制造商"
 
 #: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:515
+#: company/templates/company/supplier_part.html:153 part/serializers.py:525
 #: templates/js/translated/company.js:351
 #: templates/js/translated/company.js:1107
 #: templates/js/translated/company.js:1302
@@ -4214,7 +4224,7 @@ msgid "Parameter value"
 msgstr "参数值"
 
 #: company/models.py:623 company/templates/company/supplier_part.html:168
-#: part/admin.py:57 part/models.py:1008 part/models.py:3613
+#: part/admin.py:57 part/models.py:1008 part/models.py:3622
 #: part/templates/part/part_base.html:284
 #: templates/js/translated/company.js:1415 templates/js/translated/part.js:1511
 #: templates/js/translated/part.js:1615 templates/js/translated/part.js:2370
@@ -4242,7 +4252,7 @@ msgstr ""
 #: company/models.py:795 company/templates/company/company_base.html:81
 #: company/templates/company/supplier_part.html:129 order/models.py:453
 #: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:499 plugin/builtin/suppliers/digikey.py:25
 #: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
 #: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
 #: templates/email/overdue_purchase_order.html:16
@@ -4259,7 +4269,7 @@ msgstr "供应商"
 msgid "Select supplier"
 msgstr "选择供应商"
 
-#: company/models.py:802 part/serializers.py:500
+#: company/models.py:802 part/serializers.py:510
 msgid "Supplier stock keeping unit"
 msgstr ""
 
@@ -4276,13 +4286,13 @@ msgid "Supplier part description"
 msgstr "供应商商品描述"
 
 #: company/models.py:834 company/templates/company/supplier_part.html:187
-#: part/admin.py:418 part/models.py:4035 part/templates/part/upload_bom.html:59
+#: part/admin.py:418 part/models.py:4044 part/templates/part/upload_bom.html:59
 #: report/templates/report/inventree_bill_of_materials_report.html:140
 #: report/templates/report/inventree_po_report_base.html:32
 #: report/templates/report/inventree_return_order_report_base.html:27
 #: report/templates/report/inventree_slr_report.html:105
 #: report/templates/report/inventree_so_report_base.html:32
-#: stock/serializers.py:557
+#: stock/serializers.py:565
 msgid "Note"
 msgstr "备注"
 
@@ -4295,7 +4305,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "最低收费(例如库存费)"
 
 #: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1331
 #: stock/templates/stock/item_base.html:240
 #: templates/js/translated/company.js:1636
 #: templates/js/translated/stock.js:2387
@@ -4403,7 +4413,7 @@ msgstr ""
 #: company/templates/company/company_base.html:86 order/models.py:898
 #: order/models.py:1993 order/templates/order/return_order_base.html:131
 #: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1073
+#: stock/models.py:808 stock/serializers.py:1081
 #: stock/templates/stock/item_base.html:405
 #: templates/email/overdue_sales_order.html:16
 #: templates/js/translated/company.js:502
@@ -4628,7 +4638,7 @@ msgstr ""
 
 #: company/templates/company/manufacturer_part.html:119
 #: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/serializers.py:802
+#: part/admin.py:122 part/serializers.py:819
 #: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
 #: templates/navbar.html:48
 msgid "Suppliers"
@@ -4732,7 +4742,7 @@ msgid "No supplier information available"
 msgstr ""
 
 #: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:499
+#: part/bom.py:311 part/serializers.py:509
 #: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
 #: templates/js/translated/pricing.js:510
 #: templates/js/translated/purchase_order.js:1851
@@ -4782,10 +4792,10 @@ msgid "Update Part Availability"
 msgstr ""
 
 #: company/templates/company/supplier_part_sidebar.html:5
-#: part/serializers.py:801 part/stocktake.py:223
+#: part/serializers.py:818 part/stocktake.py:223
 #: part/templates/part/category.html:183
 #: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/serializers.py:768 stock/serializers.py:932
 #: stock/templates/stock/location.html:170
 #: stock/templates/stock/location.html:184
 #: stock/templates/stock/location.html:196
@@ -4847,7 +4857,7 @@ msgstr "标签"
 msgid "Label template file"
 msgstr "标签模板文件"
 
-#: label/models.py:143 part/models.py:3484 report/models.py:322
+#: label/models.py:143 part/models.py:3493 report/models.py:323
 #: templates/js/translated/part.js:2900
 #: templates/js/translated/table_filters.js:481
 msgid "Enabled"
@@ -4873,7 +4883,7 @@ msgstr "高度 [mm]"
 msgid "Label height, specified in mm"
 msgstr "标注高度,以毫米为单位。"
 
-#: label/models.py:163 report/models.py:315
+#: label/models.py:163 report/models.py:316
 msgid "Filename Pattern"
 msgstr "文件名样式"
 
@@ -4889,8 +4899,8 @@ msgid "Query filters (comma-separated list of key=value pairs)"
 msgstr "查询筛选器 (逗号分隔的键值对列表)"
 
 #: label/models.py:314 label/models.py:353 label/models.py:378
-#: label/models.py:413 report/models.py:343 report/models.py:494
-#: report/models.py:530 report/models.py:566 report/models.py:688
+#: label/models.py:413 report/models.py:344 report/models.py:495
+#: report/models.py:531 report/models.py:567 report/models.py:749
 msgid "Filters"
 msgstr "筛选器"
 
@@ -5072,13 +5082,13 @@ msgstr "已退回"
 msgid "Total price for this order"
 msgstr "负责此订单的用户或群组"
 
-#: order/models.py:95 order/serializers.py:54
+#: order/models.py:95 order/serializers.py:65
 #, fuzzy
 #| msgid "Currency"
 msgid "Order Currency"
 msgstr "货币"
 
-#: order/models.py:98 order/serializers.py:55
+#: order/models.py:98 order/serializers.py:66
 msgid "Currency for this order (leave blank to use company default)"
 msgstr ""
 
@@ -5279,7 +5289,7 @@ msgstr ""
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:1406 stock/models.py:926 stock/serializers.py:378
+#: order/models.py:1406 stock/models.py:926 stock/serializers.py:386
 #: stock/templates/stock/item_base.html:183
 #: templates/js/translated/stock.js:2274
 msgid "Purchase Price"
@@ -5334,8 +5344,8 @@ msgstr ""
 msgid "User who checked this shipment"
 msgstr ""
 
-#: order/models.py:1668 order/models.py:1879 order/serializers.py:1321
-#: order/serializers.py:1431 templates/js/translated/model_renderers.js:448
+#: order/models.py:1668 order/models.py:1879 order/serializers.py:1343
+#: order/serializers.py:1453 templates/js/translated/model_renderers.js:448
 msgid "Shipment"
 msgstr ""
 
@@ -5383,7 +5393,7 @@ msgstr ""
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:1859 order/serializers.py:1198
+#: order/models.py:1859 order/serializers.py:1220
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
@@ -5463,169 +5473,169 @@ msgstr ""
 msgid "Cost associated with return or repair for this line item"
 msgstr ""
 
-#: order/serializers.py:266
+#: order/serializers.py:277
 msgid "Order cannot be cancelled"
 msgstr "无法取消订单"
 
-#: order/serializers.py:281 order/serializers.py:1214
+#: order/serializers.py:292 order/serializers.py:1236
 msgid "Allow order to be closed with incomplete line items"
 msgstr ""
 
-#: order/serializers.py:291 order/serializers.py:1224
+#: order/serializers.py:302 order/serializers.py:1246
 msgid "Order has incomplete line items"
 msgstr ""
 
-#: order/serializers.py:408
+#: order/serializers.py:430
 msgid "Order is not open"
 msgstr ""
 
-#: order/serializers.py:429
+#: order/serializers.py:451
 #, fuzzy
 #| msgid "Part Pricing"
 msgid "Auto Pricing"
 msgstr "商品价格"
 
-#: order/serializers.py:431
+#: order/serializers.py:453
 msgid "Automatically calculate purchase price based on supplier part data"
 msgstr ""
 
-#: order/serializers.py:441
+#: order/serializers.py:463
 msgid "Purchase price currency"
 msgstr ""
 
-#: order/serializers.py:447
+#: order/serializers.py:469
 #, fuzzy
 #| msgid "Select Stock Items"
 msgid "Merge Items"
 msgstr "选择库存项"
 
-#: order/serializers.py:449
+#: order/serializers.py:471
 msgid "Merge items with the same part, destination and target date into one line item"
 msgstr ""
 
-#: order/serializers.py:467
+#: order/serializers.py:489
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/serializers.py:470
+#: order/serializers.py:492
 msgid "Purchase order must be specified"
 msgstr ""
 
-#: order/serializers.py:478
+#: order/serializers.py:500
 msgid "Supplier must match purchase order"
 msgstr ""
 
-#: order/serializers.py:479
+#: order/serializers.py:501
 msgid "Purchase order must match supplier"
 msgstr ""
 
-#: order/serializers.py:518 order/serializers.py:1292
+#: order/serializers.py:540 order/serializers.py:1314
 msgid "Line Item"
 msgstr ""
 
-#: order/serializers.py:524
+#: order/serializers.py:546
 msgid "Line item does not match purchase order"
 msgstr ""
 
-#: order/serializers.py:534 order/serializers.py:642 order/serializers.py:1647
+#: order/serializers.py:556 order/serializers.py:664 order/serializers.py:1669
 msgid "Select destination location for received items"
 msgstr ""
 
-#: order/serializers.py:550 templates/js/translated/purchase_order.js:1130
+#: order/serializers.py:572 templates/js/translated/purchase_order.js:1130
 msgid "Enter batch code for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:558 templates/js/translated/purchase_order.js:1154
+#: order/serializers.py:580 templates/js/translated/purchase_order.js:1154
 msgid "Enter serial numbers for incoming stock items"
 msgstr ""
 
-#: order/serializers.py:569 templates/js/translated/barcode.js:52
+#: order/serializers.py:591 templates/js/translated/barcode.js:52
 msgid "Barcode"
 msgstr "条形码"
 
-#: order/serializers.py:570
+#: order/serializers.py:592
 #, fuzzy
 #| msgid "Scan Barcode"
 msgid "Scanned barcode"
 msgstr "扫描条形码"
 
-#: order/serializers.py:586
+#: order/serializers.py:608
 msgid "Barcode is already in use"
 msgstr ""
 
-#: order/serializers.py:610
+#: order/serializers.py:632
 msgid "An integer quantity must be provided for trackable parts"
 msgstr ""
 
-#: order/serializers.py:658 order/serializers.py:1663
+#: order/serializers.py:680 order/serializers.py:1685
 msgid "Line items must be provided"
 msgstr ""
 
-#: order/serializers.py:674
+#: order/serializers.py:696
 msgid "Destination location must be specified"
 msgstr ""
 
-#: order/serializers.py:685
+#: order/serializers.py:707
 msgid "Supplied barcode values must be unique"
 msgstr ""
 
-#: order/serializers.py:1042
+#: order/serializers.py:1064
 msgid "Sale price currency"
 msgstr ""
 
-#: order/serializers.py:1102
+#: order/serializers.py:1124
 msgid "No shipment details provided"
 msgstr ""
 
-#: order/serializers.py:1162 order/serializers.py:1301
+#: order/serializers.py:1184 order/serializers.py:1323
 msgid "Line item is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1181
+#: order/serializers.py:1203
 msgid "Quantity must be positive"
 msgstr ""
 
-#: order/serializers.py:1311
+#: order/serializers.py:1333
 msgid "Enter serial numbers to allocate"
 msgstr ""
 
-#: order/serializers.py:1333 order/serializers.py:1439
+#: order/serializers.py:1355 order/serializers.py:1461
 msgid "Shipment has already been shipped"
 msgstr ""
 
-#: order/serializers.py:1336 order/serializers.py:1442
+#: order/serializers.py:1358 order/serializers.py:1464
 msgid "Shipment is not associated with this order"
 msgstr ""
 
-#: order/serializers.py:1383
+#: order/serializers.py:1405
 msgid "No match found for the following serial numbers"
 msgstr ""
 
-#: order/serializers.py:1390
+#: order/serializers.py:1412
 msgid "The following serial numbers are already allocated"
 msgstr ""
 
-#: order/serializers.py:1617
+#: order/serializers.py:1639
 msgid "Return order line item"
 msgstr ""
 
-#: order/serializers.py:1623
+#: order/serializers.py:1645
 #, fuzzy
 #| msgid "Build output does not match Build Order"
 msgid "Line item does not match return order"
 msgstr "生产产出与订单不匹配"
 
-#: order/serializers.py:1626
+#: order/serializers.py:1648
 #, fuzzy
 #| msgid "This build output has already been completed"
 msgid "Line item has already been received"
 msgstr "此生产产出已经完成"
 
-#: order/serializers.py:1655
+#: order/serializers.py:1677
 msgid "Items can only be received against orders which are in progress"
 msgstr ""
 
-#: order/serializers.py:1733
+#: order/serializers.py:1755
 #, fuzzy
 #| msgid "Uses default currency"
 msgid "Line price currency"
@@ -6053,12 +6063,12 @@ msgstr ""
 msgid "Updated {part} unit-price to {price} and quantity to {qty}"
 msgstr ""
 
-#: part/admin.py:39 part/admin.py:404 part/models.py:3886 part/stocktake.py:218
+#: part/admin.py:39 part/admin.py:404 part/models.py:3895 part/stocktake.py:218
 #: stock/admin.py:153
 msgid "Part ID"
 msgstr "商品ID"
 
-#: part/admin.py:41 part/admin.py:411 part/models.py:3887 part/stocktake.py:219
+#: part/admin.py:41 part/admin.py:411 part/models.py:3896 part/stocktake.py:219
 #: stock/admin.py:157
 msgid "Part Name"
 msgstr ""
@@ -6075,7 +6085,7 @@ msgid "IPN"
 msgstr ""
 
 #: part/admin.py:50 part/models.py:912 part/templates/part/part_base.html:277
-#: report/models.py:193 templates/js/translated/part.js:1231
+#: report/models.py:194 templates/js/translated/part.js:1231
 #: templates/js/translated/part.js:2347
 msgid "Revision"
 msgstr ""
@@ -6153,8 +6163,8 @@ msgstr ""
 msgid "Category Path"
 msgstr "类别路径"
 
-#: part/admin.py:323 part/models.py:390 part/serializers.py:112
-#: part/serializers.py:265 part/serializers.py:381
+#: part/admin.py:323 part/models.py:390 part/serializers.py:117
+#: part/serializers.py:272 part/serializers.py:391
 #: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
 #: part/templates/part/category.html:141 part/templates/part/category.html:161
 #: part/templates/part/category_sidebar.html:9
@@ -6177,17 +6187,17 @@ msgstr ""
 msgid "Parent IPN"
 msgstr ""
 
-#: part/admin.py:408 part/models.py:3888
+#: part/admin.py:408 part/models.py:3897
 msgid "Part IPN"
 msgstr ""
 
-#: part/admin.py:421 part/serializers.py:1238
+#: part/admin.py:421 part/serializers.py:1256
 #: templates/js/translated/pricing.js:358
 #: templates/js/translated/pricing.js:1024
 msgid "Minimum Price"
 msgstr ""
 
-#: part/admin.py:426 part/serializers.py:1253
+#: part/admin.py:426 part/serializers.py:1271
 #: templates/js/translated/pricing.js:353
 #: templates/js/translated/pricing.js:1032
 msgid "Maximum Price"
@@ -6273,8 +6283,8 @@ msgstr ""
 msgid "This option must be selected"
 msgstr ""
 
-#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:396 part/serializers.py:1094
+#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3840
+#: part/serializers.py:406 part/serializers.py:1112
 #: part/templates/part/part_base.html:260 stock/api.py:733
 #: templates/InvenTree/settings/settings_staff_js.html:300
 #: templates/js/translated/notification.js:60
@@ -6291,7 +6301,7 @@ msgstr ""
 msgid "Default Location"
 msgstr "默认仓储地点"
 
-#: part/bom.py:171 part/serializers.py:803
+#: part/bom.py:171 part/serializers.py:820
 #: templates/email/low_stock_notification.html:16
 msgid "Total Stock"
 msgstr ""
@@ -6300,7 +6310,7 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:81 part/models.py:3832 part/templates/part/category.html:16
+#: part/models.py:81 part/models.py:3841 part/templates/part/category.html:16
 #: part/templates/part/part_app_base.html:10
 msgid "Part Category"
 msgstr "商品类别"
@@ -6383,7 +6393,7 @@ msgstr ""
 msgid "Parts cannot be assigned to structural part categories!"
 msgstr ""
 
-#: part/models.py:854 part/models.py:3887
+#: part/models.py:854 part/models.py:3896
 msgid "Part name"
 msgstr "商品名称"
 
@@ -6721,626 +6731,632 @@ msgstr ""
 msgid "User who requested this stocktake report"
 msgstr ""
 
-#: part/models.py:3438
-msgid "Test templates can only be created for trackable parts"
+#: part/models.py:3434
+msgid "Invalid template name - must include at least one alphanumeric character"
 msgstr ""
 
-#: part/models.py:3448
-msgid "Test with this name already exists for this part"
+#: part/models.py:3445
+msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:3464 templates/js/translated/part.js:2879
+#: part/models.py:3456
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Test template with the same key already exists for part"
+msgstr "使用此文件名的附件已存在"
+
+#: part/models.py:3473 templates/js/translated/part.js:2879
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:3465
+#: part/models.py:3474
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:3471
+#: part/models.py:3480
 msgid "Test Key"
 msgstr ""
 
-#: part/models.py:3472
+#: part/models.py:3481
 msgid "Simplified key for the test"
 msgstr ""
 
-#: part/models.py:3479
+#: part/models.py:3488
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:3480
+#: part/models.py:3489
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:3484
+#: part/models.py:3493
 msgid "Is this test enabled?"
 msgstr ""
 
-#: part/models.py:3489 templates/js/translated/part.js:2908
+#: part/models.py:3498 templates/js/translated/part.js:2908
 #: templates/js/translated/table_filters.js:477
 msgid "Required"
 msgstr ""
 
-#: part/models.py:3490
+#: part/models.py:3499
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:3495 templates/js/translated/part.js:2916
+#: part/models.py:3504 templates/js/translated/part.js:2916
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:3496
+#: part/models.py:3505
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:3501 templates/js/translated/part.js:2923
+#: part/models.py:3510 templates/js/translated/part.js:2923
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:3503
+#: part/models.py:3512
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:3550
+#: part/models.py:3559
 msgid "Checkbox parameters cannot have units"
 msgstr ""
 
-#: part/models.py:3555
+#: part/models.py:3564
 msgid "Checkbox parameters cannot have choices"
 msgstr ""
 
-#: part/models.py:3575
+#: part/models.py:3584
 #, fuzzy
 #| msgid "Key string must be unique"
 msgid "Choices must be unique"
 msgstr "关键字必须是唯一的"
 
-#: part/models.py:3592
+#: part/models.py:3601
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:3607
+#: part/models.py:3616
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:3614
+#: part/models.py:3623
 msgid "Physical units for this parameter"
 msgstr ""
 
-#: part/models.py:3622
+#: part/models.py:3631
 msgid "Parameter description"
 msgstr ""
 
-#: part/models.py:3628 templates/js/translated/part.js:1627
+#: part/models.py:3637 templates/js/translated/part.js:1627
 #: templates/js/translated/table_filters.js:821
 msgid "Checkbox"
 msgstr ""
 
-#: part/models.py:3629
+#: part/models.py:3638
 msgid "Is this parameter a checkbox?"
 msgstr ""
 
-#: part/models.py:3634 templates/js/translated/part.js:1636
+#: part/models.py:3643 templates/js/translated/part.js:1636
 msgid "Choices"
 msgstr ""
 
-#: part/models.py:3635
+#: part/models.py:3644
 msgid "Valid choices for this parameter (comma-separated)"
 msgstr ""
 
-#: part/models.py:3712
+#: part/models.py:3721
 #, fuzzy
 #| msgid "Invalid choice for parent build"
 msgid "Invalid choice for parameter value"
 msgstr "上级生产选项无效"
 
-#: part/models.py:3755
+#: part/models.py:3764
 msgid "Parent Part"
 msgstr ""
 
-#: part/models.py:3763 part/models.py:3839 part/models.py:3840
+#: part/models.py:3772 part/models.py:3848 part/models.py:3849
 #: templates/InvenTree/settings/settings_staff_js.html:295
 msgid "Parameter Template"
 msgstr "参数模板"
 
-#: part/models.py:3768
+#: part/models.py:3777
 msgid "Data"
 msgstr ""
 
-#: part/models.py:3769
+#: part/models.py:3778
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:3846 templates/InvenTree/settings/settings_staff_js.html:304
+#: part/models.py:3855 templates/InvenTree/settings/settings_staff_js.html:304
 msgid "Default Value"
 msgstr "默认值"
 
-#: part/models.py:3847
+#: part/models.py:3856
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:3885
+#: part/models.py:3894
 msgid "Part ID or part name"
 msgstr ""
 
-#: part/models.py:3886
+#: part/models.py:3895
 msgid "Unique part ID value"
 msgstr ""
 
-#: part/models.py:3888
+#: part/models.py:3897
 msgid "Part IPN value"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "Level"
 msgstr ""
 
-#: part/models.py:3889
+#: part/models.py:3898
 msgid "BOM level"
 msgstr ""
 
-#: part/models.py:3979
+#: part/models.py:3988
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:3989
+#: part/models.py:3998
 msgid "Sub part"
 msgstr ""
 
-#: part/models.py:3990
+#: part/models.py:3999
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:4001
+#: part/models.py:4010
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:4007
+#: part/models.py:4016
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:4013
+#: part/models.py:4022
 msgid "This BOM item is consumable (it is not tracked in build orders)"
 msgstr ""
 
-#: part/models.py:4020 part/templates/part/upload_bom.html:55
+#: part/models.py:4029 part/templates/part/upload_bom.html:55
 msgid "Overage"
 msgstr ""
 
-#: part/models.py:4021
+#: part/models.py:4030
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:4028
+#: part/models.py:4037
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:4036
+#: part/models.py:4045
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:4042
+#: part/models.py:4051
 msgid "Checksum"
 msgstr ""
 
-#: part/models.py:4043
+#: part/models.py:4052
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:4048 templates/js/translated/table_filters.js:174
+#: part/models.py:4057 templates/js/translated/table_filters.js:174
 msgid "Validated"
 msgstr ""
 
-#: part/models.py:4049
+#: part/models.py:4058
 #, fuzzy
 #| msgid "Some stock items have been overallocated"
 msgid "This BOM item has been validated"
 msgstr "一些库存项已被过度分配"
 
-#: part/models.py:4054 part/templates/part/upload_bom.html:57
+#: part/models.py:4063 part/templates/part/upload_bom.html:57
 #: templates/js/translated/bom.js:1054
 #: templates/js/translated/table_filters.js:178
 #: templates/js/translated/table_filters.js:211
 msgid "Gets inherited"
 msgstr ""
 
-#: part/models.py:4055
+#: part/models.py:4064
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:4060 part/templates/part/upload_bom.html:56
+#: part/models.py:4069 part/templates/part/upload_bom.html:56
 #: templates/js/translated/bom.js:1046
 msgid "Allow Variants"
 msgstr ""
 
-#: part/models.py:4061
+#: part/models.py:4070
 msgid "Stock items for variant parts can be used for this BOM item"
 msgstr ""
 
-#: part/models.py:4146 stock/models.py:649
+#: part/models.py:4155 stock/models.py:649
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:4156 part/models.py:4158
+#: part/models.py:4165 part/models.py:4167
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:4298
+#: part/models.py:4307
 msgid "BOM Item Substitute"
 msgstr ""
 
-#: part/models.py:4319
+#: part/models.py:4328
 msgid "Substitute part cannot be the same as the master part"
 msgstr ""
 
-#: part/models.py:4332
+#: part/models.py:4341
 msgid "Parent BOM item"
 msgstr ""
 
-#: part/models.py:4340
+#: part/models.py:4349
 msgid "Substitute part"
 msgstr ""
 
-#: part/models.py:4356
+#: part/models.py:4365
 msgid "Part 1"
 msgstr ""
 
-#: part/models.py:4364
+#: part/models.py:4373
 msgid "Part 2"
 msgstr ""
 
-#: part/models.py:4365
+#: part/models.py:4374
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:4384
+#: part/models.py:4393
 msgid "Part relationship cannot be created between a part and itself"
 msgstr ""
 
-#: part/models.py:4389
+#: part/models.py:4398
 msgid "Duplicate relationship already exists"
 msgstr ""
 
-#: part/serializers.py:114 part/serializers.py:134
+#: part/serializers.py:119 part/serializers.py:141
 #: part/templates/part/category.html:122 part/templates/part/category.html:207
 #: part/templates/part/category_sidebar.html:7
 msgid "Subcategories"
 msgstr "子类别"
 
-#: part/serializers.py:178
+#: part/serializers.py:185
 msgid "Results"
 msgstr ""
 
-#: part/serializers.py:179
+#: part/serializers.py:186
 msgid "Number of results recorded against this template"
 msgstr ""
 
-#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
+#: part/serializers.py:210 part/serializers.py:228 stock/serializers.py:392
 msgid "Purchase currency of this stock item"
 msgstr ""
 
-#: part/serializers.py:266
+#: part/serializers.py:273
 msgid "Number of parts using this template"
 msgstr ""
 
-#: part/serializers.py:387
+#: part/serializers.py:397
 #, fuzzy
 #| msgid "Rejected"
 msgid "No parts selected"
 msgstr "已拒绝"
 
-#: part/serializers.py:397
+#: part/serializers.py:407
 #, fuzzy
 #| msgid "Set category"
 msgid "Select category"
 msgstr "设置类别"
 
-#: part/serializers.py:427
+#: part/serializers.py:437
 msgid "Original Part"
 msgstr ""
 
-#: part/serializers.py:428
+#: part/serializers.py:438
 msgid "Select original part to duplicate"
 msgstr ""
 
-#: part/serializers.py:433
+#: part/serializers.py:443
 msgid "Copy Image"
 msgstr ""
 
-#: part/serializers.py:434
+#: part/serializers.py:444
 msgid "Copy image from original part"
 msgstr ""
 
-#: part/serializers.py:440 part/templates/part/detail.html:277
+#: part/serializers.py:450 part/templates/part/detail.html:277
 msgid "Copy BOM"
 msgstr ""
 
-#: part/serializers.py:441
+#: part/serializers.py:451
 msgid "Copy bill of materials from original part"
 msgstr ""
 
-#: part/serializers.py:447
+#: part/serializers.py:457
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/serializers.py:448
+#: part/serializers.py:458
 msgid "Copy parameter data from original part"
 msgstr ""
 
-#: part/serializers.py:454
+#: part/serializers.py:464
 #, fuzzy
 #| msgid "Company Notes"
 msgid "Copy Notes"
 msgstr "公司备注"
 
-#: part/serializers.py:455
+#: part/serializers.py:465
 msgid "Copy notes from original part"
 msgstr ""
 
-#: part/serializers.py:468
+#: part/serializers.py:478
 msgid "Initial Stock Quantity"
 msgstr ""
 
-#: part/serializers.py:470
+#: part/serializers.py:480
 msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
 msgstr ""
 
-#: part/serializers.py:477
+#: part/serializers.py:487
 msgid "Initial Stock Location"
 msgstr ""
 
-#: part/serializers.py:478
+#: part/serializers.py:488
 msgid "Specify initial stock location for this Part"
 msgstr ""
 
-#: part/serializers.py:490
+#: part/serializers.py:500
 msgid "Select supplier (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:506
+#: part/serializers.py:516
 msgid "Select manufacturer (or leave blank to skip)"
 msgstr ""
 
-#: part/serializers.py:516
+#: part/serializers.py:526
 msgid "Manufacturer part number"
 msgstr ""
 
-#: part/serializers.py:523
+#: part/serializers.py:533
 msgid "Selected company is not a valid supplier"
 msgstr ""
 
-#: part/serializers.py:532
+#: part/serializers.py:542
 msgid "Selected company is not a valid manufacturer"
 msgstr ""
 
-#: part/serializers.py:543
+#: part/serializers.py:553
 msgid "Manufacturer part matching this MPN already exists"
 msgstr ""
 
-#: part/serializers.py:550
+#: part/serializers.py:560
 msgid "Supplier part matching this SKU already exists"
 msgstr ""
 
-#: part/serializers.py:804
+#: part/serializers.py:821
 #, fuzzy
 #| msgid "External Link"
 msgid "External Stock"
 msgstr "外部链接"
 
-#: part/serializers.py:806
+#: part/serializers.py:823
 #, fuzzy
 #| msgid "Unallocate Stock"
 msgid "Unallocated Stock"
 msgstr "未分配库存"
 
-#: part/serializers.py:808
+#: part/serializers.py:826
 #, fuzzy
 #| msgid "Part Stock"
 msgid "Variant Stock"
 msgstr "商品库存"
 
-#: part/serializers.py:833 part/templates/part/copy_part.html:9
+#: part/serializers.py:851 part/templates/part/copy_part.html:9
 #: templates/js/translated/part.js:471
 msgid "Duplicate Part"
 msgstr "复制部件"
 
-#: part/serializers.py:834
+#: part/serializers.py:852
 msgid "Copy initial data from another Part"
 msgstr ""
 
-#: part/serializers.py:840 templates/js/translated/part.js:102
+#: part/serializers.py:858 templates/js/translated/part.js:102
 msgid "Initial Stock"
 msgstr ""
 
-#: part/serializers.py:841
+#: part/serializers.py:859
 msgid "Create Part with initial stock quantity"
 msgstr ""
 
-#: part/serializers.py:847
+#: part/serializers.py:865
 msgid "Supplier Information"
 msgstr ""
 
-#: part/serializers.py:848
+#: part/serializers.py:866
 msgid "Add initial supplier information for this part"
 msgstr ""
 
-#: part/serializers.py:856
+#: part/serializers.py:874
 msgid "Copy Category Parameters"
 msgstr "复制类别参数"
 
-#: part/serializers.py:857
+#: part/serializers.py:875
 msgid "Copy parameter templates from selected part category"
 msgstr ""
 
-#: part/serializers.py:862
+#: part/serializers.py:880
 #, fuzzy
 #| msgid "Existing barcode found"
 msgid "Existing Image"
 msgstr "发现现有条码"
 
-#: part/serializers.py:863
+#: part/serializers.py:881
 msgid "Filename of an existing part image"
 msgstr ""
 
-#: part/serializers.py:880
+#: part/serializers.py:898
 #, fuzzy
 #| msgid "Part image not found"
 msgid "Image file does not exist"
 msgstr "未找到商品图像"
 
-#: part/serializers.py:1086
+#: part/serializers.py:1104
 msgid "Limit stocktake report to a particular part, and any variant parts"
 msgstr ""
 
-#: part/serializers.py:1096
+#: part/serializers.py:1114
 msgid "Limit stocktake report to a particular part category, and any child categories"
 msgstr ""
 
-#: part/serializers.py:1106
+#: part/serializers.py:1124
 msgid "Limit stocktake report to a particular stock location, and any child locations"
 msgstr ""
 
-#: part/serializers.py:1112
+#: part/serializers.py:1130
 msgid "Exclude External Stock"
 msgstr ""
 
-#: part/serializers.py:1113
+#: part/serializers.py:1131
 #, fuzzy
 #| msgid "Exclude stock items from this selected location"
 msgid "Exclude stock items in external locations"
 msgstr "从该选定的仓储地点排除库存项"
 
-#: part/serializers.py:1118
+#: part/serializers.py:1136
 msgid "Generate Report"
 msgstr ""
 
-#: part/serializers.py:1119
+#: part/serializers.py:1137
 msgid "Generate report file containing calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1124
+#: part/serializers.py:1142
 msgid "Update Parts"
 msgstr ""
 
-#: part/serializers.py:1125
+#: part/serializers.py:1143
 msgid "Update specified parts with calculated stocktake data"
 msgstr ""
 
-#: part/serializers.py:1133
+#: part/serializers.py:1151
 msgid "Stocktake functionality is not enabled"
 msgstr ""
 
-#: part/serializers.py:1239
+#: part/serializers.py:1257
 msgid "Override calculated value for minimum price"
 msgstr ""
 
-#: part/serializers.py:1246
+#: part/serializers.py:1264
 #, fuzzy
 #| msgid "Uses default currency"
 msgid "Minimum price currency"
 msgstr "使用默认货币"
 
-#: part/serializers.py:1254
+#: part/serializers.py:1272
 msgid "Override calculated value for maximum price"
 msgstr ""
 
-#: part/serializers.py:1261
+#: part/serializers.py:1279
 #, fuzzy
 #| msgid "Uses default currency"
 msgid "Maximum price currency"
 msgstr "使用默认货币"
 
-#: part/serializers.py:1290
+#: part/serializers.py:1308
 msgid "Update"
 msgstr ""
 
-#: part/serializers.py:1291
+#: part/serializers.py:1309
 msgid "Update pricing for this part"
 msgstr ""
 
-#: part/serializers.py:1314
+#: part/serializers.py:1332
 #, python-brace-format
 msgid "Could not convert from provided currencies to {default_currency}"
 msgstr ""
 
-#: part/serializers.py:1321
+#: part/serializers.py:1339
 msgid "Minimum price must not be greater than maximum price"
 msgstr ""
 
-#: part/serializers.py:1324
+#: part/serializers.py:1342
 msgid "Maximum price must not be less than minimum price"
 msgstr ""
 
-#: part/serializers.py:1660
+#: part/serializers.py:1678
 msgid "Select part to copy BOM from"
 msgstr ""
 
-#: part/serializers.py:1668
+#: part/serializers.py:1686
 msgid "Remove Existing Data"
 msgstr ""
 
-#: part/serializers.py:1669
+#: part/serializers.py:1687
 msgid "Remove existing BOM items before copying"
 msgstr ""
 
-#: part/serializers.py:1674
+#: part/serializers.py:1692
 msgid "Include Inherited"
 msgstr ""
 
-#: part/serializers.py:1675
+#: part/serializers.py:1693
 msgid "Include BOM items which are inherited from templated parts"
 msgstr ""
 
-#: part/serializers.py:1680
+#: part/serializers.py:1698
 msgid "Skip Invalid Rows"
 msgstr ""
 
-#: part/serializers.py:1681
+#: part/serializers.py:1699
 msgid "Enable this option to skip invalid rows"
 msgstr ""
 
-#: part/serializers.py:1686
+#: part/serializers.py:1704
 msgid "Copy Substitute Parts"
 msgstr ""
 
-#: part/serializers.py:1687
+#: part/serializers.py:1705
 msgid "Copy substitute parts when duplicate BOM items"
 msgstr ""
 
-#: part/serializers.py:1721
+#: part/serializers.py:1739
 msgid "Clear Existing BOM"
 msgstr ""
 
-#: part/serializers.py:1722
+#: part/serializers.py:1740
 msgid "Delete existing BOM items before uploading"
 msgstr ""
 
-#: part/serializers.py:1752
+#: part/serializers.py:1770
 msgid "No part column specified"
 msgstr ""
 
-#: part/serializers.py:1796
+#: part/serializers.py:1814
 msgid "Multiple matching parts found"
 msgstr ""
 
-#: part/serializers.py:1799
+#: part/serializers.py:1817
 msgid "No matching part found"
 msgstr ""
 
-#: part/serializers.py:1802
+#: part/serializers.py:1820
 msgid "Part is not designated as a component"
 msgstr ""
 
-#: part/serializers.py:1811
+#: part/serializers.py:1829
 msgid "Quantity not provided"
 msgstr ""
 
-#: part/serializers.py:1819
+#: part/serializers.py:1837
 msgid "Invalid quantity"
 msgstr ""
 
-#: part/serializers.py:1840
+#: part/serializers.py:1858
 msgid "At least one BOM item is required"
 msgstr ""
 
@@ -8430,7 +8446,7 @@ msgstr ""
 msgid "Print a border around each label"
 msgstr ""
 
-#: plugin/builtin/labels/label_sheet.py:47 report/models.py:207
+#: plugin/builtin/labels/label_sheet.py:47 report/models.py:208
 msgid "Landscape"
 msgstr ""
 
@@ -8767,16 +8783,16 @@ msgstr "删除仓储地"
 msgid "Delete the plugin configuration from the database"
 msgstr ""
 
-#: report/api.py:175
+#: report/api.py:158
 msgid "No valid objects provided to template"
 msgstr "没有为模板提供有效对象"
 
-#: report/api.py:214 report/api.py:251
+#: report/api.py:197 report/api.py:234
 #, python-brace-format
 msgid "Template file '{template}' is missing or does not exist"
 msgstr ""
 
-#: report/api.py:331
+#: report/api.py:319
 msgid "Test report"
 msgstr ""
 
@@ -8796,105 +8812,117 @@ msgstr ""
 msgid "Letter"
 msgstr ""
 
-#: report/models.py:175
+#: report/models.py:176
 msgid "Template name"
 msgstr ""
 
-#: report/models.py:181
+#: report/models.py:182
 msgid "Report template file"
 msgstr ""
 
-#: report/models.py:188
+#: report/models.py:189
 msgid "Report template description"
 msgstr ""
 
-#: report/models.py:194
+#: report/models.py:195
 msgid "Report revision number (auto-increments)"
 msgstr ""
 
-#: report/models.py:202
+#: report/models.py:203
 #, fuzzy
 #| msgid "Default page size for PDF reports"
 msgid "Page size for PDF reports"
 msgstr "PDF 报表默认页面大小"
 
-#: report/models.py:208
+#: report/models.py:209
 msgid "Render report in landscape orientation"
 msgstr ""
 
-#: report/models.py:316
+#: report/models.py:317
 msgid "Pattern for generating report filenames"
 msgstr ""
 
-#: report/models.py:323
+#: report/models.py:324
 msgid "Report template is enabled"
 msgstr ""
 
-#: report/models.py:345
+#: report/models.py:346
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
 msgstr ""
 
-#: report/models.py:352
+#: report/models.py:353
 msgid "Include Installed Tests"
 msgstr ""
 
-#: report/models.py:354
+#: report/models.py:355
 msgid "Include test results for stock items installed inside assembled item"
 msgstr ""
 
-#: report/models.py:422
+#: report/models.py:423
 msgid "Build Filters"
 msgstr ""
 
-#: report/models.py:423
+#: report/models.py:424
 msgid "Build query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:462
+#: report/models.py:463
 msgid "Part Filters"
 msgstr "商品过滤器"
 
-#: report/models.py:463
+#: report/models.py:464
 msgid "Part query filters (comma-separated list of key=value pairs"
 msgstr ""
 
-#: report/models.py:495
+#: report/models.py:496
 msgid "Purchase order query filters"
 msgstr ""
 
-#: report/models.py:531
+#: report/models.py:532
 msgid "Sales order query filters"
 msgstr ""
 
-#: report/models.py:567
+#: report/models.py:568
 msgid "Return order query filters"
 msgstr ""
 
-#: report/models.py:615
+#: report/models.py:640
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Snippet file with this name already exists"
+msgstr "使用此文件名的附件已存在"
+
+#: report/models.py:647
 msgid "Snippet"
 msgstr ""
 
-#: report/models.py:616
+#: report/models.py:648
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:623
+#: report/models.py:655
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:660
+#: report/models.py:713
+#, fuzzy
+#| msgid "Attachment with this filename already exists"
+msgid "Asset file with this name already exists"
+msgstr "使用此文件名的附件已存在"
+
+#: report/models.py:721
 msgid "Asset"
 msgstr ""
 
-#: report/models.py:661
+#: report/models.py:722
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:668
+#: report/models.py:729
 msgid "Asset file description"
 msgstr ""
 
-#: report/models.py:690
+#: report/models.py:751
 #, fuzzy
 #| msgid "Query filters (comma-separated list of key=value pairs),"
 msgid "stock location query filters (comma-separated list of key=value pairs)"
@@ -9231,7 +9259,7 @@ msgstr ""
 msgid "Stock items cannot be located into structural stock locations!"
 msgstr ""
 
-#: stock/models.py:656 stock/serializers.py:275
+#: stock/models.py:656 stock/serializers.py:276
 msgid "Stock item cannot be created for virtual parts"
 msgstr ""
 
@@ -9277,7 +9305,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:786 stock/serializers.py:1324
+#: stock/models.py:786 stock/serializers.py:1332
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -9289,7 +9317,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:830 stock/serializers.py:1307
+#: stock/models.py:830 stock/serializers.py:1315
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -9371,7 +9399,7 @@ msgstr ""
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:1501 stock/serializers.py:507
+#: stock/models.py:1501 stock/serializers.py:515
 msgid "Serial numbers already exist"
 msgstr "序列号已存在"
 
@@ -9405,7 +9433,7 @@ msgstr ""
 msgid "Serialized stock cannot be merged"
 msgstr ""
 
-#: stock/models.py:1639 stock/serializers.py:1213
+#: stock/models.py:1639 stock/serializers.py:1221
 msgid "Duplicate stock items"
 msgstr ""
 
@@ -9453,202 +9481,202 @@ msgstr ""
 msgid "Test notes"
 msgstr ""
 
-#: stock/serializers.py:96
+#: stock/serializers.py:97
 #, fuzzy
 #| msgid "User or group responsible for this order"
 msgid "Test template for this result"
 msgstr "负责此订单的用户或群组"
 
-#: stock/serializers.py:115
+#: stock/serializers.py:116
 #, fuzzy
 #| msgid "Allocation items must be provided"
 msgid "Template ID or test name must be provided"
 msgstr "必须提供分配的项"
 
-#: stock/serializers.py:169
+#: stock/serializers.py:170
 msgid "Serial number is too large"
 msgstr ""
 
-#: stock/serializers.py:267
+#: stock/serializers.py:268
 msgid "Use pack size when adding: the quantity defined is the number of packs"
 msgstr ""
 
-#: stock/serializers.py:380
+#: stock/serializers.py:388
 msgid "Purchase price of this stock item, per unit or pack"
 msgstr ""
 
-#: stock/serializers.py:442
+#: stock/serializers.py:450
 msgid "Enter number of stock items to serialize"
 msgstr ""
 
-#: stock/serializers.py:455
+#: stock/serializers.py:463
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({q})"
 msgstr ""
 
-#: stock/serializers.py:462
+#: stock/serializers.py:470
 msgid "Enter serial numbers for new items"
 msgstr "输入新项目的序列号"
 
-#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
+#: stock/serializers.py:481 stock/serializers.py:1178 stock/serializers.py:1434
 msgid "Destination stock location"
 msgstr "目标库存位置"
 
-#: stock/serializers.py:480
+#: stock/serializers.py:488
 msgid "Optional note field"
 msgstr ""
 
-#: stock/serializers.py:490
+#: stock/serializers.py:498
 msgid "Serial numbers cannot be assigned to this part"
 msgstr ""
 
-#: stock/serializers.py:545
+#: stock/serializers.py:553
 msgid "Select stock item to install"
 msgstr ""
 
-#: stock/serializers.py:552
+#: stock/serializers.py:560
 msgid "Quantity to Install"
 msgstr ""
 
-#: stock/serializers.py:553
+#: stock/serializers.py:561
 #, fuzzy
 #| msgid "Enter quantity for build output"
 msgid "Enter the quantity of items to install"
 msgstr "输入生产产出数量"
 
-#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
-#: stock/serializers.py:779
+#: stock/serializers.py:566 stock/serializers.py:641 stock/serializers.py:737
+#: stock/serializers.py:787
 msgid "Add transaction note (optional)"
 msgstr "添加交易备注 (可选)"
 
-#: stock/serializers.py:566
+#: stock/serializers.py:574
 #, fuzzy
 #| msgid "Quantity must be a positive number"
 msgid "Quantity to install must be at least 1"
 msgstr "数量必须大于0"
 
-#: stock/serializers.py:574
+#: stock/serializers.py:582
 msgid "Stock item is unavailable"
 msgstr ""
 
-#: stock/serializers.py:581
+#: stock/serializers.py:589
 msgid "Selected part is not in the Bill of Materials"
 msgstr ""
 
-#: stock/serializers.py:593
+#: stock/serializers.py:601
 #, fuzzy
 #| msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
 msgid "Quantity to install must not exceed available quantity"
 msgstr "分配数量 ({q}) 不得超过可用库存数量 ({a})"
 
-#: stock/serializers.py:628
+#: stock/serializers.py:636
 msgid "Destination location for uninstalled item"
 msgstr ""
 
-#: stock/serializers.py:663
+#: stock/serializers.py:671
 msgid "Select part to convert stock item into"
 msgstr ""
 
-#: stock/serializers.py:676
+#: stock/serializers.py:684
 msgid "Selected part is not a valid option for conversion"
 msgstr ""
 
-#: stock/serializers.py:693
+#: stock/serializers.py:701
 msgid "Cannot convert stock item with assigned SupplierPart"
 msgstr ""
 
-#: stock/serializers.py:724
+#: stock/serializers.py:732
 msgid "Destination location for returned item"
 msgstr ""
 
-#: stock/serializers.py:761
+#: stock/serializers.py:769
 #, fuzzy
 #| msgid "Selected stock item not found in BOM"
 msgid "Select stock items to change status"
 msgstr "在BOM中找不到选定的库存项"
 
-#: stock/serializers.py:767
+#: stock/serializers.py:775
 #, fuzzy
 #| msgid "Stock item created"
 msgid "No stock items selected"
 msgstr "库存项已创建"
 
-#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/serializers.py:871 stock/serializers.py:934
 #: stock/templates/stock/location.html:165
 #: stock/templates/stock/location.html:213
 #: stock/templates/stock/location_sidebar.html:5
 msgid "Sublocations"
 msgstr ""
 
-#: stock/serializers.py:1042
+#: stock/serializers.py:1050
 msgid "Part must be salable"
 msgstr ""
 
-#: stock/serializers.py:1046
+#: stock/serializers.py:1054
 msgid "Item is allocated to a sales order"
 msgstr ""
 
-#: stock/serializers.py:1050
+#: stock/serializers.py:1058
 msgid "Item is allocated to a build order"
 msgstr ""
 
-#: stock/serializers.py:1074
+#: stock/serializers.py:1082
 msgid "Customer to assign stock items"
 msgstr ""
 
-#: stock/serializers.py:1080
+#: stock/serializers.py:1088
 msgid "Selected company is not a customer"
 msgstr ""
 
-#: stock/serializers.py:1088
+#: stock/serializers.py:1096
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:1098 stock/serializers.py:1352
+#: stock/serializers.py:1106 stock/serializers.py:1360
 msgid "A list of stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1177
+#: stock/serializers.py:1185
 msgid "Stock merging notes"
 msgstr ""
 
-#: stock/serializers.py:1182
+#: stock/serializers.py:1190
 msgid "Allow mismatched suppliers"
 msgstr ""
 
-#: stock/serializers.py:1183
+#: stock/serializers.py:1191
 msgid "Allow stock items with different supplier parts to be merged"
 msgstr ""
 
-#: stock/serializers.py:1188
+#: stock/serializers.py:1196
 msgid "Allow mismatched status"
 msgstr ""
 
-#: stock/serializers.py:1189
+#: stock/serializers.py:1197
 msgid "Allow stock items with different status codes to be merged"
 msgstr ""
 
-#: stock/serializers.py:1199
+#: stock/serializers.py:1207
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1266
+#: stock/serializers.py:1274
 #, fuzzy
 #| msgid "Change"
 msgid "No Change"
 msgstr "更改"
 
-#: stock/serializers.py:1295
+#: stock/serializers.py:1303
 msgid "StockItem primary key value"
 msgstr ""
 
-#: stock/serializers.py:1314
+#: stock/serializers.py:1322
 #, fuzzy
 #| msgid "Stock item created"
 msgid "Stock item status code"
 msgstr "库存项已创建"
 
-#: stock/serializers.py:1342
+#: stock/serializers.py:1350
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/bg/messages.po b/src/frontend/src/locales/bg/messages.po
index 0dc53598ce7e..a9c349dadc79 100644
--- a/src/frontend/src/locales/bg/messages.po
+++ b/src/frontend/src/locales/bg/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/cs/messages.po b/src/frontend/src/locales/cs/messages.po
index 57565decec9f..f444e192a8ae 100644
--- a/src/frontend/src/locales/cs/messages.po
+++ b/src/frontend/src/locales/cs/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/da/messages.po b/src/frontend/src/locales/da/messages.po
index a8509c27838a..853b3262c441 100644
--- a/src/frontend/src/locales/da/messages.po
+++ b/src/frontend/src/locales/da/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/de/messages.po b/src/frontend/src/locales/de/messages.po
index ecc7249da331..d25395252a87 100644
--- a/src/frontend/src/locales/de/messages.po
+++ b/src/frontend/src/locales/de/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr "Verknüpftes Bild von diesem Teil entfernen?"
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr "Entfernen"
 
@@ -49,7 +50,7 @@ msgstr "Entfernen"
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr "Virtuell"
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr "Aktualisieren"
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Löschen"
 
@@ -404,8 +409,8 @@ msgstr "Adresse"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Name: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "Status: <0>worker</0> ({0}), <1>Plugins</1>{1}"
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -467,23 +472,31 @@ msgstr "Status: <0>worker</0> ({0}), <1>Plugins</1>{1}"
 msgid "Error"
 msgstr "Fehler"
 
-#: src/components/forms/fields/RelatedModelField.tsx:298
+#: src/components/forms/fields/RelatedModelField.tsx:296
 #: src/pages/Index/Settings/UserSettings.tsx:64
 #: src/tables/Search.tsx:23
 msgid "Search"
 msgstr "Suche"
 
-#: src/components/forms/fields/RelatedModelField.tsx:299
+#: src/components/forms/fields/RelatedModelField.tsx:297
 #: src/components/modals/AboutInvenTreeModal.tsx:81
 #: src/components/widgets/WidgetLayout.tsx:134
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:309
 msgid "Loading"
 msgstr "Wird geladen"
 
-#: src/components/forms/fields/RelatedModelField.tsx:301
+#: src/components/forms/fields/RelatedModelField.tsx:299
 msgid "No results found"
 msgstr "Keine Ergebnisse gefunden"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr "Keine Ergebnisse gefunden"
 msgid "Thumbnail"
 msgstr "Vorschaubild"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr "Barcode-Aktionen"
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr "Anzeigen"
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr "Barcode anzeigen"
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr "Link-Barcode"
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr "Benutzerdefinierter Barcode verknüpfen"
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr "Verknüpfung des Barcodes aufheben"
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr "Verknüpfung von benutzerdefiniertem Barcode aufheben"
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Bearbeiten"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr "Element löschen"
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr "Duplizieren"
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr "Artikel duplizieren"
 
@@ -847,7 +861,7 @@ msgstr "Benutzereinstellungen"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr "Einstellungen"
 
@@ -933,8 +947,8 @@ msgstr "Als gelesen markieren"
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Teil-Kategorien"
 
@@ -972,7 +986,7 @@ msgstr "Keine Ergebnisse für Suchanfrage verfügbar"
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Lagerorte"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr "Unbekanntes Modell: {model}"
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "Teil"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Teile"
 
@@ -1018,7 +1040,7 @@ msgstr "Testvorlagen für Teil"
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr "Zuliefererteil"
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr "Herstellerteile"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr "Teilkategorie"
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr "Lagerartikel"
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Lagerartikel"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr "Einkaufsbestellung"
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Nachbestellungen"
@@ -1120,14 +1142,14 @@ msgstr "Bestellpositionen"
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr "Verkaufsauftrag"
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Aufträge"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr "Rückgabe Auftrag"
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr "Sendung"
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr "Lager"
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr "Seriennummer"
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr "Anzahl"
 
@@ -2182,19 +2204,91 @@ msgstr "Übergeordnete Teilkategorie"
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr "Angegebene Menge als Packungen anstatt einzelner Artikel hinzufügen"
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr "Seriennummern"
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr "Lagerartikel hinzufügen"
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr "Lagerartikel bearbeiten"
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr "Lagerartikel aktualisiert"
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr "Auf Lager"
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr "Aktionen"
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr "Anzahl"
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr "Bestand zählen"
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr "Übergeordneter Lagerort"
 
@@ -2305,19 +2475,19 @@ msgstr "Ungültiger Rückgabecode"
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr "Element angelegt"
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr "Eintrag aktualisiert"
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr "Element gelöscht"
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr "Sind Sie sicher, dass Sie dieses Element löschen möchten?"
 
@@ -2555,11 +2725,6 @@ msgstr "Mehrere Objekttypen ausgewählt"
 msgid "Actions for {0}"
 msgstr "Aktionen für {0}"
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr "Anzahl"
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr "Seite scannen"
@@ -2905,11 +3070,6 @@ msgstr "Beschriftungen"
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr "Stückliste"
 
@@ -2975,7 +3135,7 @@ msgstr "Barcode"
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr "Preise"
 
@@ -2992,20 +3152,20 @@ msgstr "Wechselkurse"
 msgid "Reporting"
 msgstr "Berichte"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr "Inventur"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr "Zu Benutzereinstellungen wechseln"
 
@@ -3069,7 +3229,7 @@ msgstr "Als ungelesen markieren"
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Status"
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr "Anhänge"
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr "Notizen"
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr "Firmen-Aktionen"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr "Parameter"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr "Lieferanten"
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr "Pfad"
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr "Kategorie"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr "Standard Lagerort"
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr "IPN"
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr "Version"
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr "Einheiten"
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr "Schlüsselwörter"
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr "Link"
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr "Verfügbarer Bestand"
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr "Auf Lager"
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr "Minimaler Bestand"
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr "Bestellt"
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr "Herstellbar"
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr "Gebäude"
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr "Gebäude"
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr "Aktiv"
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr "Nachverfolgbares Teil"
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr "Erstelldatum"
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr "Standard Zulieferer"
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
-msgstr "Preisspanne"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
+msgstr "Standard Zulieferer"
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr "Preisspanne"
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr "Letzte Inventur"
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr "Varianten"
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr "Ferienguthaben/Freitage"
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr "Verwendet in"
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr "Hersteller"
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr "Terminierung"
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr "Testvorlagen"
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr "Zugehörige Teile"
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr "Teil bearbeiten"
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr "Lager-Aktionen"
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr "Bestand zählen"
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr "Teile-Aktionen"
 
@@ -3660,43 +3829,57 @@ msgstr "Kunden"
 msgid "Pending Shipments"
 msgstr "Ausstehende Sendungen"
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr "Basisteil"
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr "Verfügbar"
 
@@ -3708,15 +3891,15 @@ msgstr "Verfügbar"
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr "Bestandsverfolgung"
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr "Test Daten"
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr "Installierte Elemente"
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr "Untergeordnete Objekte"
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr "Lagervorgänge"
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr "Bestand zählen"
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr "Hinzufügen"
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr "Lagerbestand hinzufügen"
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr "Lagerbestand entfernen"
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr "Lagerbestand verschieben"
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr "Lagerartikel duplizieren"
 
@@ -3951,10 +4131,6 @@ msgstr "Daten aktualisieren"
 msgid "Table filters"
 msgstr "Tabellenfilter"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr "Aktionen"
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr "Diese Stücklistenposition ist für ein anderes übergeordnetes Element definiert"
@@ -3986,7 +4162,7 @@ msgstr "Alternatives Lager einschließen"
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr "Alter"
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr "Alternativen einschließen"
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr "Montage"
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr "Beispiel"
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr "Installiert"
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr "Teilebeschreibung"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr "Verpackungsmenge"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr "Gesamtmenge"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr "Erhalten"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr "Lieferantennummer"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr "Lieferanten-Link"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr "Herstellernummer"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr "Preis pro Einheit"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr "Bestimmungsort"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr "Position hinzufügen"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr "Position bearbeiten"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr "Position löschen"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr "Position empfangen"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr "Position hinzufügen"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr "Erhaltene Artikel"
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr "Aktionen"
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr "Benutzer bearbeiten"
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr "Nach Lagerstatus filtern"
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr "Zugewiesen"
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr "Erschöpft"
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr "Lagerartikel für Teile-Varianten einschließen"
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr "Nachverfolgbare Freigabe"
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr "Verfolgbare Objekte anzeigen"
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
@@ -5548,4 +5770,3 @@ msgstr ""
 #: src/views/MobileAppView.tsx:23
 msgid "Read the docs"
 msgstr ""
-
diff --git a/src/frontend/src/locales/el/messages.po b/src/frontend/src/locales/el/messages.po
index eab15fe733f2..4abe264ad2bc 100644
--- a/src/frontend/src/locales/el/messages.po
+++ b/src/frontend/src/locales/el/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr "Αφαίρεση της σχετικής εικόνας από αυτό το στοιχείο;"
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr "Αφαίρεση"
 
@@ -49,7 +50,7 @@ msgstr "Αφαίρεση"
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr "Εικονικό"
 msgid "Code"
 msgstr "Κωδικός"
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr "Η προεπισκόπηση δεν είναι διαθέσιμη, πατήστε \"Επαναφόρτωση προεπισκόπησης\"."
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr "Ενημέρωση"
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Διαγραφή"
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -467,23 +472,31 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
-#: src/components/forms/fields/RelatedModelField.tsx:298
+#: src/components/forms/fields/RelatedModelField.tsx:296
 #: src/pages/Index/Settings/UserSettings.tsx:64
 #: src/tables/Search.tsx:23
 msgid "Search"
 msgstr ""
 
-#: src/components/forms/fields/RelatedModelField.tsx:299
+#: src/components/forms/fields/RelatedModelField.tsx:297
 #: src/components/modals/AboutInvenTreeModal.tsx:81
 #: src/components/widgets/WidgetLayout.tsx:134
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:309
 msgid "Loading"
 msgstr ""
 
-#: src/components/forms/fields/RelatedModelField.tsx:301
+#: src/components/forms/fields/RelatedModelField.tsx:299
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
@@ -5548,4 +5770,3 @@ msgstr ""
 #: src/views/MobileAppView.tsx:23
 msgid "Read the docs"
 msgstr ""
-
diff --git a/src/frontend/src/locales/en/messages.po b/src/frontend/src/locales/en/messages.po
index 8751e41fc710..12fa2171ef85 100644
--- a/src/frontend/src/locales/en/messages.po
+++ b/src/frontend/src/locales/en/messages.po
@@ -34,9 +34,10 @@ msgid "Remove the associated image from this item?"
 msgstr "Remove the associated image from this item?"
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr "Remove"
 
@@ -44,7 +45,7 @@ msgstr "Remove"
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -137,7 +138,11 @@ msgstr "Virtual"
 msgid "Code"
 msgstr "Code"
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr "Failed to parse error response from server."
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr "Preview not available, click \"Reload Preview\"."
 
@@ -226,17 +231,17 @@ msgid "Update"
 msgstr "Update"
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Delete"
 
@@ -399,8 +404,8 @@ msgstr "Host"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -450,7 +455,7 @@ msgstr "Name: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -479,6 +484,14 @@ msgstr "Loading"
 msgid "No results found"
 msgstr "No results found"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr "modelRenderer entry required for tables"
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr "No entries available"
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -488,54 +501,55 @@ msgstr "No results found"
 msgid "Thumbnail"
 msgstr "Thumbnail"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr "Barcode Actions"
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr "View"
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr "View barcode"
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr "Link Barcode"
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr "Link custom barcode"
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr "Unlink Barcode"
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr "Unlink custom barcode"
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Edit"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr "Delete item"
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr "Duplicate"
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr "Duplicate item"
 
@@ -842,7 +856,7 @@ msgstr "Account settings"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr "System Settings"
 
@@ -928,8 +942,8 @@ msgstr "Mark as read"
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Part Categories"
 
@@ -967,7 +981,7 @@ msgstr "No results available for search query"
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Stock Locations"
 
@@ -976,22 +990,30 @@ msgid "Unknown model: {model}"
 msgstr "Unknown model: {model}"
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "Part"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Parts"
 
@@ -1013,7 +1035,7 @@ msgstr "Part Test Templates"
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr "Supplier Part"
@@ -1031,20 +1053,20 @@ msgid "Manufacturer Parts"
 msgstr "Manufacturer Parts"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr "Part Category"
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr "Stock Item"
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Stock Items"
 
@@ -1096,10 +1118,10 @@ msgid "Purchase Order"
 msgstr "Purchase Order"
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Purchase Orders"
@@ -1115,14 +1137,14 @@ msgstr "Purchase Order Lines"
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr "Sales Order"
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Sales Orders"
@@ -1141,7 +1163,7 @@ msgid "Return Order"
 msgstr "Return Order"
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1194,23 +1216,23 @@ msgstr "Shipment"
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr "Stock"
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr "Serial Number"
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr "Quantity"
 
@@ -2177,19 +2199,91 @@ msgstr "Parent part category"
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr "Choose Location"
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr "Item Destination selected"
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr "Part category default location selected"
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr "Received stock location selected"
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr "Default location selected"
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr "Scan Barcode"
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr "Set Location"
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr "Assign Batch Code{0}"
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr "Change Status"
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr "Remove item from list"
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr "Location"
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr "Store at default location"
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr "Store at line item destination"
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr "Store with already received stock"
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr "Receive line items"
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr "Add given quantity as packs instead of individual items"
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr "Enter initial quantity for this stock item"
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr "Serial Numbers"
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr "Enter serial numbers for new stock (or leave blank)"
 
@@ -2197,21 +2291,97 @@ msgstr "Enter serial numbers for new stock (or leave blank)"
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr "Add Stock Item"
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr "Edit Stock Item"
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr "Stock item updated"
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr "Move to default location"
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr "Move"
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr "In Stock"
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr "Actions"
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr "Add"
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr "Count"
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr "Add Stock"
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr "Remove Stock"
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr "Transfer Stock"
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr "Count Stock"
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr "Change Stock Status"
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr "Merge Stock"
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr "Delete Stock Items"
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr "Parent stock location"
 
@@ -2300,19 +2470,19 @@ msgstr "Invalid Return Code"
 msgid "Server returned status {returnCode}"
 msgstr "Server returned status {returnCode}"
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr "Item Created"
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr "Item Updated"
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr "Item Deleted"
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr "Are you sure you want to delete this item?"
 
@@ -2550,11 +2720,6 @@ msgstr "Multiple object types selected"
 msgid "Actions for {0}"
 msgstr "Actions for {0}"
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr "Count"
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr "Scan Page"
@@ -2900,11 +3065,6 @@ msgstr "Labels"
 msgid "Label"
 msgstr "Label"
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr "Location"
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr "Stock item"
@@ -2935,7 +3095,7 @@ msgid "Return order"
 msgstr "Return order"
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr "Bill of Materials"
 
@@ -2970,7 +3130,7 @@ msgstr "Barcodes"
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr "Pricing"
 
@@ -2987,20 +3147,20 @@ msgstr "Exchange Rates"
 msgid "Reporting"
 msgstr "Reporting"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr "Stocktake"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Build Orders"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr "Switch to User Setting"
 
@@ -3064,7 +3224,7 @@ msgstr "Mark as unread"
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Status"
 
@@ -3077,12 +3237,12 @@ msgstr "Reference"
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3112,7 +3272,7 @@ msgid "Issued By"
 msgstr "Issued By"
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3191,22 +3351,22 @@ msgstr "Child Build Orders"
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr "Attachments"
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr "Notes"
 
@@ -3304,13 +3464,13 @@ msgid "Company Actions"
 msgstr "Company Actions"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr "Parameters"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr "Suppliers"
@@ -3324,112 +3484,129 @@ msgstr "ManufacturerPart"
 msgid "Received Stock"
 msgstr "Received Stock"
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr "Path"
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr "Parent Category"
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr "Subcategories"
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr "Structural"
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr "Parent default location"
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr "Default location"
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr "Top level part category"
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr "Edit Part Category"
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr "Category Actions"
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr "Category Details"
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr "Variant of"
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr "Category"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr "Default Location"
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr "Category Default Location"
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr "IPN"
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr "Revision"
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr "Units"
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr "Keywords"
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr "Link"
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr "Available Stock"
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr "In Stock"
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr "Minimum Stock"
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr "On order"
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr "Allocated to Build Orders"
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr "Allocated to Sales Orders"
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr "Can Build"
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr "Building"
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3437,138 +3614,130 @@ msgstr "Building"
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr "Active"
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr "Template Part"
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr "Assembled Part"
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr "Component Part"
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr "Trackable Part"
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr "Purchaseable Part"
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr "Saleable Part"
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr "Virtual Part"
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr "Creation Date"
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr "Created By"
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr "Default Supplier"
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
-msgstr "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
+msgstr "Default Supplier"
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr "Price Range"
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr "Last Stocktake"
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr "Stocktake By"
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr "Part Details"
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr "Variants"
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr "Allocations"
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr "Used In"
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr "Manufacturers"
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr "Scheduling"
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr "Test Templates"
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr "Related Parts"
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr "Edit Part"
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr "Stock Actions"
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr "Count Stock"
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr "Count part stock"
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr "Transfer Stock"
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr "Transfer part stock"
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr "Part Actions"
 
@@ -3655,43 +3824,57 @@ msgstr "Customers"
 msgid "Pending Shipments"
 msgstr "Pending Shipments"
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr "Parent Location"
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr "Sublocations"
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr "External"
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr "Top level stock location"
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr "Location Details"
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr "Default Parts"
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr "Edit Stock Location"
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr "Location Actions"
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr "Base Part"
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr "Stock Status"
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr "Last Updated"
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr "Available"
 
@@ -3703,15 +3886,15 @@ msgstr "Available"
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr "Installed In"
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr "Consumed By"
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr "Packaging"
 
@@ -3723,57 +3906,54 @@ msgstr "Packaging"
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr "Stock Details"
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr "Stock Tracking"
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr "Test Data"
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr "Installed Items"
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr "Child Items"
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr "Stock Operations"
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr "Count stock"
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr "Add"
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr "Add stock"
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr "Remove stock"
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr "Transfer"
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr "Transfer stock"
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr "Duplicate stock item"
 
@@ -3946,10 +4126,6 @@ msgstr "Refresh data"
 msgid "Table filters"
 msgstr "Table filters"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr "Actions"
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr "This BOM item is defined for a different parent"
@@ -3981,7 +4157,7 @@ msgstr "Includes variant stock"
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr "Stock Information"
 
@@ -4107,7 +4283,7 @@ msgid "In production"
 msgstr "In production"
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr "No stock available"
 
@@ -4376,7 +4552,7 @@ msgstr "Age"
 msgid "Message"
 msgstr "Message"
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr "Internal Units"
@@ -4398,10 +4574,6 @@ msgstr "Show structural categories"
 msgid "New Part Category"
 msgstr "New Part Category"
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr "Edit Part Category"
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr "Add Part Category"
@@ -4425,7 +4597,7 @@ msgid "Add parameter"
 msgstr "Add parameter"
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr "Include Variants"
 
@@ -4491,7 +4663,7 @@ msgid "Filter by part active status"
 msgstr "Filter by part active status"
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr "Assembly"
 
@@ -4868,7 +5040,7 @@ msgid "Sample"
 msgstr "Sample"
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr "Installed"
 
@@ -4920,65 +5092,65 @@ msgstr "Manufacturer part deleted"
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr "Are you sure you want to remove this manufacturer part?"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr "Part Description"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr "Pack Quantity"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr "Total Quantity"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr "Received"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr "Supplier Code"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr "Supplier Link"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr "Manufacturer Code"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr "Unit Price"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr "Destination"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr "Add Line Item"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr "Edit Line Item"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr "Delete Line Item"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr "Receive line item"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr "Add line item"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr "Receive items"
 
@@ -5185,26 +5357,31 @@ msgstr "Last Run"
 msgid "Next Run"
 msgstr "Next Run"
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr "{templateTypeTranslation} with id {id} not found"
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr "An error occurred while fetching {templateTypeTranslation} details"
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr "actions"
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr "Enabled"
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr "Create new"
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr "Filter by enabled status"
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr "User with id {id} not found"
@@ -5270,155 +5447,204 @@ msgstr "Added user"
 msgid "Edit user"
 msgstr "Edit user"
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr "This stock item is in production"
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr "This stock item has been assigned to a sales order"
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr "This stock item has been assigned to a customer"
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr "This stock item is installed in another stock item"
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr "This stock item has been consumed by a build order"
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr "This stock item has expired"
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr "This stock item is stale"
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr "This stock item is fully allocated"
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr "This stock item is partially allocated"
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr "This stock item has been depleted"
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr "Show stock for active parts"
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr "Filter by stock status"
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr "Show stock for assmebled parts"
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr "Allocated"
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr "Show items which have been allocated"
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr "Show items which are available"
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr "Include Sublocations"
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr "Include stock in sublocations"
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr "Depleted"
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr "Show depleted stock items"
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr "Show items which are in stock"
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr "In Production"
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr "Show items which are in production"
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr "Include stock items for variant parts"
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr "Show stock items which are installed in other items"
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr "Sent to Customer"
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr "Show items which have been sent to a customer"
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr "Is Serialized"
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr "Show items which have a serial number"
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr "Has Batch Code"
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr "Show items which have a batch code"
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr "Tracked"
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr "Show tracked items"
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr "Has Purchase Price"
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr "Show items which have a purchase price"
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr "External Location"
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr "Show items in an external location"
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr "Add a new stock item"
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr "Remove some quantity from a stock item"
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr "Move Stock items to new locations"
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr "Change stock status"
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr "Change the status of stock items"
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr "Merge stock"
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr "Merge stock items"
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr "Order stock"
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr "Order new stock"
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr "Assign to customer"
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr "Delete stock"
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr "Delete stock items"
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr "Test"
@@ -5528,10 +5754,6 @@ msgstr "Has location type"
 msgid "Add Stock Location"
 msgstr "Add Stock Location"
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr "Edit Stock Location"
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr "Mobile viewport detected"
diff --git a/src/frontend/src/locales/es-mx/messages.po b/src/frontend/src/locales/es-mx/messages.po
index 44cf47f6a9f1..e1a384512699 100644
--- a/src/frontend/src/locales/es-mx/messages.po
+++ b/src/frontend/src/locales/es-mx/messages.po
@@ -34,9 +34,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -44,7 +45,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -137,7 +138,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -226,17 +231,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -380,8 +385,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -431,7 +436,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -460,6 +465,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr ""
@@ -469,54 +482,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -823,7 +837,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -901,8 +915,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -940,7 +954,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -949,22 +963,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -986,7 +1008,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1004,20 +1026,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1069,10 +1091,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1088,14 +1110,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1114,7 +1136,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1167,23 +1189,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2074,19 +2096,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2094,21 +2188,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2193,19 +2363,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2315,11 +2485,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2665,11 +2830,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2700,7 +2860,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2735,7 +2895,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2752,20 +2912,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -2825,7 +2985,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -2838,12 +2998,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -2873,7 +3033,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -2952,22 +3112,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3065,13 +3225,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3085,112 +3245,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3198,138 +3375,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr ""
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3412,43 +3581,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3460,15 +3643,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3480,57 +3663,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3703,10 +3883,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3738,7 +3914,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -3864,7 +4040,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4133,7 +4309,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4155,10 +4331,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4182,7 +4354,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4248,7 +4420,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4625,7 +4797,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4677,65 +4849,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -4942,26 +5114,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5027,155 +5204,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5285,10 +5511,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/es/messages.po b/src/frontend/src/locales/es/messages.po
index cc98552cf1b7..38bc5f02176b 100644
--- a/src/frontend/src/locales/es/messages.po
+++ b/src/frontend/src/locales/es/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Nombre: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Órdenes de compra"
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr "En Stock"
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr "Agregar"
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr "Etiquetas"
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr "Códigos de barras"
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr "Precios"
 
@@ -2992,20 +3152,20 @@ msgstr "Tasas de cambio"
 msgid "Reporting"
 msgstr "Informes"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Ordenes de Producción"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr "Cambiar a Configuración de Usuario"
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr "Parámetros"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr "Proveedores"
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr "En Stock"
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr "Activo"
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr "Contar stock"
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr "Agregar"
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr "Agregar stock"
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr "Remover stock"
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr "Transferir"
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr "Transferir stock"
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr "Duplicar artículo de stock"
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr "Añadir Artículo de Línea"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr "Recibir artículos"
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr "Usuario agregado"
 msgid "Edit user"
 msgstr "Editar usuario"
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr "En producción"
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/fa/messages.po b/src/frontend/src/locales/fa/messages.po
index 6203ac6b8021..4f86d421806f 100644
--- a/src/frontend/src/locales/fa/messages.po
+++ b/src/frontend/src/locales/fa/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/fi/messages.po b/src/frontend/src/locales/fi/messages.po
index b59389fbeb52..f132c7ec5fa8 100644
--- a/src/frontend/src/locales/fi/messages.po
+++ b/src/frontend/src/locales/fi/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/fr/messages.po b/src/frontend/src/locales/fr/messages.po
index 38c8505a966c..bd99356925ee 100644
--- a/src/frontend/src/locales/fr/messages.po
+++ b/src/frontend/src/locales/fr/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr "Supprimer l'image associée de cet élément ?"
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr "Supprimer"
 
@@ -49,7 +50,7 @@ msgstr "Supprimer"
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr "Mise à jour"
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Supprimer"
 
@@ -404,8 +409,8 @@ msgstr "Serveur"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Nom : {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr "Chargement"
 msgid "No results found"
 msgstr "Aucun résultat trouvé"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr "Aucun résultat trouvé"
 msgid "Thumbnail"
 msgstr "Miniature"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr "Actions de code-barres"
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr "Vue"
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr "Voir le code-barre"
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr "Lier le code-barre"
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr "Lier un code-barre personnalisé"
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr "Délier le code-barre"
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr "Délier le code-barres personnalisé"
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Éditer"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr "Supprimer l’article"
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr "Dupliquer"
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr "Dupliquer l'article"
 
@@ -847,7 +861,7 @@ msgstr "Paramètres du compte"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr "Les paramètres du système"
 
@@ -933,8 +947,8 @@ msgstr "Marqué comme lu"
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Catégories de composants"
 
@@ -972,7 +986,7 @@ msgstr "Aucun résultat disponible pour la requête"
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Emplacements de stock"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr "Modèle inconnu : {model}"
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "Pièce"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Composants"
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr "Pièce fournisseur"
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr "Pièces du fabricant"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr "Catégorie de composant"
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr "Article en stock"
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Articles en stock"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr "Commande d’achat"
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Ordres d'achat"
@@ -1120,14 +1142,14 @@ msgstr "Lignes de commande d'achat"
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr "Ventes"
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Ordres de vente"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr "Retour de commande"
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr "Catégorie de pièce parente"
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr "Ajouter une quantité en paquet au lieu de pièces individuelles"
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr "Entrez la quantité initiale pour cet article en stock"
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr "Numéros de Série"
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr "Entrez les numéros de série pour le nouveau stock (ou laisser vide)"
 
@@ -2202,21 +2296,97 @@ msgstr "Entrez les numéros de série pour le nouveau stock (ou laisser vide)"
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr "Ajouter un article en stock"
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr "Actions"
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Ordres de fabrication"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Status"
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr "Catégorie"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr "Emplacement par défaut"
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr "Révision"
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr "Unités"
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr "Mots-clés"
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr "Lien"
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr "Stock Minimum"
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr "Sur commande"
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr "Alloué à l'ordre de construction"
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr "Alloué aux ordres de ventes"
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr "Peut être construit"
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr "Construire"
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr "Construire"
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr "Date de création"
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr "Fournisseur par Défaut"
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
-msgstr "Échelle des prix"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
+msgstr "Fournisseur par Défaut"
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr "Échelle des prix"
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr "Dernier inventaire"
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr "Variants"
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr "Allocations"
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr "Disponible"
 
@@ -3708,15 +3891,15 @@ msgstr "Disponible"
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr "Actualiser les données"
 msgid "Table filters"
 msgstr "Filtres de tableau"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr "Actions"
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr "Cet article de nomenclature est défini pour un autre parent"
@@ -3986,7 +4162,7 @@ msgstr "Inclut le stock de variantes"
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr "Information de stock"
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/he/messages.po b/src/frontend/src/locales/he/messages.po
index 0a8be460c65d..64c74104811e 100644
--- a/src/frontend/src/locales/he/messages.po
+++ b/src/frontend/src/locales/he/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/hi/messages.po b/src/frontend/src/locales/hi/messages.po
index eba67dc95bf7..5d8cdca25eca 100644
--- a/src/frontend/src/locales/hi/messages.po
+++ b/src/frontend/src/locales/hi/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/hu/messages.po b/src/frontend/src/locales/hu/messages.po
index 2daf8c062c00..f87e415f74a5 100644
--- a/src/frontend/src/locales/hu/messages.po
+++ b/src/frontend/src/locales/hu/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr "Eltávolítás"
 
@@ -49,7 +50,7 @@ msgstr "Eltávolítás"
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr "Virtuális"
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Törlés"
 
@@ -404,8 +409,8 @@ msgstr "Kiszolgáló"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Név: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "Státusz: <0>worker</0> ({0}), <1>plugins</1>{1}"
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr "Betöltés"
 msgid "No results found"
 msgstr "Nincs találat"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr "Nincs találat"
 msgid "Thumbnail"
 msgstr "Bélyegkép"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr "Vonalkód műveletek"
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr "Megtekintés"
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr "Vonalkód megtekintése"
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr "Vonalkód hozzárendelése"
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr "Egyedi vonalkód hozzárendelése"
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr "Vonalkód leválasztása"
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr "Egyedi vonalkód leválasztása"
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Szerkesztés"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr "Tétel törlése"
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr "Másolás"
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr "Elem másolása"
 
@@ -847,7 +861,7 @@ msgstr "Fiókbeállítások"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr "Rendszerbeállítások"
 
@@ -933,8 +947,8 @@ msgstr "Megjelölés olvasottként"
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Alkatrész kategóriák"
 
@@ -972,7 +986,7 @@ msgstr "Nincs találat a keresésre"
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Készlethelyek"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr "Ismeretlen model: {model}"
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "Alkatrész"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Alkatrészek"
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr "Beszállítói alkatrész"
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr "Gyártói alkatrészek"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr "Alkatrész kategória"
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr "Készlet tétel"
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Készlet tételek"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr "Beszerzési rendelés"
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Beszerzési rendelések"
@@ -1120,14 +1142,14 @@ msgstr "Beszerzési rendelés tételei"
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr "Vevői rendelés"
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Vevői rendelések"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr "Visszavétel"
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr "Szállítmány"
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr "Készlet"
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr "Sorozatszám"
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr "Mennyiség"
 
@@ -2182,19 +2204,91 @@ msgstr "Felsőbb szintű alkatrész kategória"
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr "Mennyiség hozzáadása csomagolási egységenként egyedi tételek helyett"
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr "Add meg a kezdeti mennyiséget ehhez a készlet tételhez"
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr "Sorozatszámok"
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr "Add meg az új készlet tételhez tartozó sorozatszámokat (vagy hagyd üresen)"
 
@@ -2202,21 +2296,97 @@ msgstr "Add meg az új készlet tételhez tartozó sorozatszámokat (vagy hagyd
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr "Készlet tétel szerkesztése"
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr "Készlet tétel frissítve"
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr "Készleten"
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr "Műveletek"
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr "Hozzáadás"
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr "Mennyiség"
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr "Készlet áthelyezése"
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr "Leltározás"
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr "Érvénytelen visszatérési kód"
 msgid "Server returned status {returnCode}"
 msgstr "Szerver válaszkódja {returnCode}"
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr "Többféle objektum típus lett kiválasztva"
 msgid "Actions for {0}"
 msgstr "{0} műveletei"
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr "Mennyiség"
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr "Kódolvasó lap"
@@ -2905,11 +3070,6 @@ msgstr "Címkék"
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr "Alkatrészjegyzék"
 
@@ -2975,7 +3135,7 @@ msgstr "Vonalkódok"
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr "Árazás"
 
@@ -2992,20 +3152,20 @@ msgstr "Árfolyamok"
 msgid "Reporting"
 msgstr "Riportolás"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr "Leltár"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Gyártási utasítások"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr "Felhasználói beállításra váltás"
 
@@ -3069,7 +3229,7 @@ msgstr "Megjelölés olvasatlanként"
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Állapot"
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr "Alárendelt gyártások"
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr "Mellékletek"
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr "Megjegyzések"
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr "Cég műveletek"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr "Paraméterek"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr "Beszállítók"
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr "Beérkezett készlet"
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr "Elérési út"
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr "Szerkezeti"
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr "Kategória"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr "IPN"
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr "Mértékegységek"
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr "Link"
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr "Készleten"
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr "Rendelve"
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr "Gyártható"
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr "Gyártásban"
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr "Gyártásban"
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr "Aktív"
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr "Gyártmány alkatrész"
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr "Létrehozás dátuma"
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
-msgstr "Ártartomány"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
+msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr "Ártartomány"
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr "Változatok"
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr "Foglalások"
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr "Felhasználva ebben"
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr "Gyártók"
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr "Ütemezés"
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr "Teszt sablonok"
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr "Kapcsolódó alkatrészek"
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr "Alkatrész szerkesztése"
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr "Készlet műveletek"
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr "Leltározás"
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr "Készlet számolása"
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr "Készlet áthelyezése"
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr "Készlet áthelyezése"
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr "Alkatrész műveletek"
 
@@ -3660,43 +3829,57 @@ msgstr "Vevők"
 msgid "Pending Shipments"
 msgstr "Függő szállítmányok"
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr "Kiindulási alkatrész"
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr "Elérhető"
 
@@ -3708,15 +3891,15 @@ msgstr "Elérhető"
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr "Készlettörténet"
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr "Teszt adatok"
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr "Beépített tételek"
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr "Gyermek tételek"
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr "Készlet műveletek"
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr "Leltározás"
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr "Hozzáadás"
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr "Készlethez ad"
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr "Készlet csökkentése"
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr "Áthelyezés"
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr "Készlet áthelyezése"
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr "Készlet tétel másolása"
 
@@ -3951,10 +4131,6 @@ msgstr "Adatok frissítése"
 msgid "Table filters"
 msgstr "Táblaszűrők"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr "Műveletek"
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr "Ez a beépülő alkatrész másik szülő alkatrészhez lett felvéve"
@@ -3986,7 +4162,7 @@ msgstr "Változatokkal együtt"
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr "Készlet adatok"
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr "Nincs elérhető készlet"
 
@@ -4381,7 +4557,7 @@ msgstr "Életkor"
 msgid "Message"
 msgstr "Üzenet"
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr "Paraméter hozzáadás"
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr "Változatok is"
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr "Szűrés aktív státusz szerint"
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr "Gyártmány"
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr "Minta"
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr "Telepítve"
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr "Alkatrész leírása"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr "Csomagolási mennyiség"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr "Teljes mennyiség"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr "Fogadott"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr "Beszállítói kód"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr "Beszállítói link"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr "Gyártói kód"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr "Egységár"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr "Cél"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr "Sortétel hozzáadása"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr "Sortétel szerkesztése"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr "Sortétel bevételezése"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr "Sortétel hozzáadása"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr "Bevételezés"
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr "Felhasználó hozzáadása sikeres"
 msgid "Edit user"
 msgstr "Felhasználó szerkesztése"
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr "Ez a készlet tétel gyártásban van"
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr "Készlet tétel hozzárendelve egy vevői rendeléshez"
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr "Készlet tétel hozzárendelve egy vevőhöz"
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr "Készlet tétel beépült egy másikba"
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr "Készlet tétel fel lett használva egy gyártásban"
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr "Készlet tétel lejárt"
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr "Készlet tétel lejárt"
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr "Készlet tétel teljesen foglalva"
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr "Készlet tétel részlegesen foglalva"
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr "Készlet tétel elfogyott"
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr "Mobil kijelző érzékelve"
diff --git a/src/frontend/src/locales/it/messages.po b/src/frontend/src/locales/it/messages.po
index 83ab1693a77b..f075614a996b 100644
--- a/src/frontend/src/locales/it/messages.po
+++ b/src/frontend/src/locales/it/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/ja/messages.po b/src/frontend/src/locales/ja/messages.po
index 65b8d8a89866..fef5a771e817 100644
--- a/src/frontend/src/locales/ja/messages.po
+++ b/src/frontend/src/locales/ja/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr "仮想部品"
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "削除"
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr "読み込み中"
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr "サムネイル"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "編集"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr "既読にする"
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "在庫場所"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "パーツ"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "パーツ"
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr "在庫商品"
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "在庫商品"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr "在庫"
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr "この商品の初期数量を入力"
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr "在庫商品を編集"
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr "価格"
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr "未読にする"
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr "添付ファイル"
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr "メモ"
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr "表フィルタ"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr "有効なパーツでフィルタ"
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/ko/messages.po b/src/frontend/src/locales/ko/messages.po
index 39fbd7042937..41b39f07433c 100644
--- a/src/frontend/src/locales/ko/messages.po
+++ b/src/frontend/src/locales/ko/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/nl/messages.po b/src/frontend/src/locales/nl/messages.po
index 52023565854b..649eec2e2de1 100644
--- a/src/frontend/src/locales/nl/messages.po
+++ b/src/frontend/src/locales/nl/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr "Verkooporder"
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Verkooporders"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr "Retourorder"
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Productieorders"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Status"
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr "Bijlagen"
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr "Opmerkingen"
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr "Klanten"
 msgid "Pending Shipments"
 msgstr "In afwachting van verzending"
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr "Voorraadartikel is toegewezen aan een verkooporder"
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/no/messages.po b/src/frontend/src/locales/no/messages.po
index 1546bb173ab3..a0b5261a5a0c 100644
--- a/src/frontend/src/locales/no/messages.po
+++ b/src/frontend/src/locales/no/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr "Fjern"
 
@@ -49,7 +50,7 @@ msgstr "Fjern"
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr "Virtuell"
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr "Oppdater"
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Slett"
 
@@ -404,8 +409,8 @@ msgstr "Vert"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Navn: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "Status: <0>arbeider</0> ({0}), <1>utvidelser</1>{1}"
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr "Laster"
 msgid "No results found"
 msgstr "Ingen resultater funnet"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr "Ingen resultater funnet"
 msgid "Thumbnail"
 msgstr "Miniatyrbilde"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr "Strekkodehandlinger"
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr "Visning"
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr "Vis strekkode"
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr "Koble mot strekkode"
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr "Koble til egendefinert strekkode"
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr "Fjern strekkodekobling"
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr "Koble fra egendefinert strekkode"
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Rediger"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr "Slett element"
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr "Dupliser"
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr "Dupliser element"
 
@@ -847,7 +861,7 @@ msgstr "Kontoinnstillinger"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr "Systeminnstillinger"
 
@@ -933,8 +947,8 @@ msgstr "Merk som lest"
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Delkategorier"
 
@@ -972,7 +986,7 @@ msgstr "Ingen resultater tilgjengelig for søk"
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Lagerplasseringer"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr "Ukjent modell: {model}"
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "Del"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Deler"
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr "Leverandørdel"
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr "Produsentdeler"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr "Delkategori"
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr "Lagervare"
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Lagervarer"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr "Innkjøpsordre"
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Innkjøpsordrer"
@@ -1120,14 +1142,14 @@ msgstr "Ordrelinjer for innkjøpsordre"
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr "Salgsordre"
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Salgsordrer"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr "Returordre"
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr "Forsendelse"
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr "Lagerbeholdning"
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr "Serienummer"
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr "Antall"
 
@@ -2182,19 +2204,91 @@ msgstr "Overordnet del-kategori"
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr "Legg til gitt mengde som pakker i stedet for enkeltprodukter"
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr "Angi innledende antall for denne lagervaren"
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr "Serienumre"
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr "Angi serienumre for ny lagerbeholdning (eller la stå tom)"
 
@@ -2202,21 +2296,97 @@ msgstr "Angi serienumre for ny lagerbeholdning (eller la stå tom)"
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr "Rediger lagervare"
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr "Lagervare oppdatert"
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr "På lager"
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr "Handlinger"
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr "Legg til"
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr "Tell"
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr "Overfør lager"
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr "Tell beholdning"
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr "Ugyldig returkode"
 msgid "Server returned status {returnCode}"
 msgstr "Serveren returnerte status {returnCode}"
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr "Flere objekttyper er valgt"
 msgid "Actions for {0}"
 msgstr "Handlinger for {0}"
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr "Tell"
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr "Skann side"
@@ -2905,11 +3070,6 @@ msgstr "Etiketter"
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr "Stykkliste (BOM)"
 
@@ -2975,7 +3135,7 @@ msgstr "Strekkoder"
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr "Prising"
 
@@ -2992,20 +3152,20 @@ msgstr "Valutakurser"
 msgid "Reporting"
 msgstr "Rapportering"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr "Lagertelling"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Produksjonsordrer"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr "Bytt til brukerinnstilling"
 
@@ -3069,7 +3229,7 @@ msgstr "Marker som ulest"
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Status"
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr "Underordnede Produksjonsordrer"
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr "Vedlegg"
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr "Notater"
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr "Bedriftshandlinger"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr "Parametere"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr "Leverandører"
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr "Mottatt lagerbeholdning"
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr "Sti"
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr "Strukturell"
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr "Kategori"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr "IPN"
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr "Enheter"
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr "Nøkkelord"
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr "Lenke"
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr "På lager"
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr "I bestilling"
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr "Kan Produsere"
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr "Produseres"
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr "Produseres"
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr "Aktiv"
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr "Sammenstilt del"
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr "Sporbar del"
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr "Opprettelsesdato"
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
-msgstr "Prisområde"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
+msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr "Prisområde"
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr "Varianter"
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr "Tildelinger"
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr "Brukt i"
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr "Produsenter"
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr "Planlegging"
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr "Testmaler"
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr "Relaterte Deler"
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr "Rediger del"
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr "Lagerhandlinger"
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr "Tell beholdning"
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr "Tell delbeholdning"
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr "Overfør lager"
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr "Overfør delbeholdning"
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr "Delhandlinger"
 
@@ -3660,43 +3829,57 @@ msgstr "Kunder"
 msgid "Pending Shipments"
 msgstr "Ventende forsendelser"
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr "Basisdel"
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr "Tilgjengelig"
 
@@ -3708,15 +3891,15 @@ msgstr "Tilgjengelig"
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr "Sporing av lager"
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr "Testdata"
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr "Installerte artikler"
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr "Underordnede artikler"
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr "Lagerhandlinger"
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr "Tell beholdning"
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr "Legg til"
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr "Legg til lager"
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr "Fjern lager"
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr "Overfør"
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr "Overfør lager"
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr "Dupliser lagervare"
 
@@ -3951,10 +4131,6 @@ msgstr "Oppdater data"
 msgid "Table filters"
 msgstr "Tabellfiltre"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr "Handlinger"
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr "Denne BOM-artikkelen er definert for en annen overordnet del"
@@ -3986,7 +4162,7 @@ msgstr "Inkluderer variantbeholdning"
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr "Lagerinformasjon"
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr "Ingen lagerbeholdning tilgjengelig"
 
@@ -4381,7 +4557,7 @@ msgstr "Alder"
 msgid "Message"
 msgstr "Melding"
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr "Vis strukturelle kategorier"
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr "Legg til parameter"
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr "Inkluder varianter"
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr "Filtrer etter del aktiv-status"
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr "Sammenstilling"
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr "Eksempel"
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr "Installert"
 
@@ -4925,65 +5097,65 @@ msgstr "Produsentdel slettet"
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr "Er du sikker på at du vil fjerne denne produsentdelen?"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr "Delbeskrivelse"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr "Pakkeantall"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr "Totalt Antall"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr "Mottatt"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr "Leverandørkode"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr "Leverandørlenke"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr "Produsentens kode"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr "Enhetspris"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr "Destinasjon"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr "Legg til ordrelinje"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr "Rediger ordrelinje"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr "Motta ordrelinje"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr "Legg til ordrelinje"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr "Motta artikler"
 
@@ -5190,26 +5362,31 @@ msgstr "Sist kjørt"
 msgid "Next Run"
 msgstr "Neste kjøring"
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr "Bruker med Id {id} ble ikke funnet"
@@ -5275,155 +5452,204 @@ msgstr "Bruker lagt til"
 msgid "Edit user"
 msgstr "Rediger bruker"
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr "Denne lagervaren er i produksjon"
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr "Denne lagervaren har blitt tildelt en salgsordre"
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr "Denne lagervaren har blitt tilordnet en kunde"
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr "Denne lagervaren er montert i en annen lagervare"
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr "Denne lagervaren har blitt konsumert av en produksjonsordre"
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr "Denne lagervaren har utløpt"
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr "Denne lagervaren er gammel"
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr "Denne lagervaren er i sin helhet tilordnet"
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr "Denne lagervaren er delvis tilordnet"
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr "Denne lagervaren er oppbrukt"
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr "Vis lagerbeholdning for aktive deler"
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr "Filtrer etter lagerstatus"
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr "Vis lagerbeholdning for sammensatte deler"
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr "Tildelt"
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr "Vis elementer som har blitt tildelt"
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr "Vis elementer som er tilgjengelige"
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr "Inkluder underplasseringer"
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr "Inkluder lager i underplasseringer"
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr "Oppbrukt"
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr "Vis oppbrukte lagervarer"
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr "Vis elementer som er på lager"
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr "Under produksjon"
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr "Vis elementer som er under produksjon"
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr "Inkluder lagervarer for variantdeler"
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr "Vis lagervarer som er installert i andre elementer"
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr "Sendt til kunde"
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr "Vis elementer som er sendt til en kunde"
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr "Er serialisert"
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr "Vis elementer som har et serienummer"
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr "Har batchkode"
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr "Vis elementer som har en batchkode"
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr "Spores"
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr "Vis sporede deler"
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr "Har innkjøpspris"
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr "Vis elementer som har innkjøpspris"
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr "Ekstern plassering"
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr "Vis elementer ved en ekstern plassering"
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr "Har plasseringstype"
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr "Mobilvisning oppdaget"
diff --git a/src/frontend/src/locales/pl/messages.po b/src/frontend/src/locales/pl/messages.po
index efd46ac59aac..f8dc230b641b 100644
--- a/src/frontend/src/locales/pl/messages.po
+++ b/src/frontend/src/locales/pl/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/pseudo-LOCALE/messages.po b/src/frontend/src/locales/pseudo-LOCALE/messages.po
index 03ad38f0e5d9..9fc56e6cf4d6 100644
--- a/src/frontend/src/locales/pseudo-LOCALE/messages.po
+++ b/src/frontend/src/locales/pseudo-LOCALE/messages.po
@@ -74,9 +74,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -84,7 +85,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -177,7 +178,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -266,17 +271,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -439,8 +444,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -490,7 +495,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -519,6 +524,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr ""
@@ -528,54 +541,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -886,7 +900,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -972,8 +986,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -1011,7 +1025,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -1020,22 +1034,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1057,7 +1079,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1075,20 +1097,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1140,10 +1162,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1159,14 +1181,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1185,7 +1207,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1238,23 +1260,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2221,19 +2243,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2241,21 +2335,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2344,19 +2514,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2594,11 +2764,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2944,11 +3109,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2979,7 +3139,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -3014,7 +3174,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -3031,20 +3191,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3108,7 +3268,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3121,12 +3281,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3156,7 +3316,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3235,22 +3395,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3348,13 +3508,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3368,112 +3528,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3481,138 +3658,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr ""
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3699,43 +3868,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3747,15 +3930,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3767,57 +3950,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3990,10 +4170,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -4025,7 +4201,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4151,7 +4327,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4420,7 +4596,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4442,10 +4618,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4469,7 +4641,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4535,7 +4707,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4912,7 +5084,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4964,65 +5136,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5229,26 +5401,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5314,155 +5491,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5572,10 +5798,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/pt-br/messages.po b/src/frontend/src/locales/pt-br/messages.po
index 2c56e2f5ce3e..0aa799b76cf0 100644
--- a/src/frontend/src/locales/pt-br/messages.po
+++ b/src/frontend/src/locales/pt-br/messages.po
@@ -34,9 +34,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -44,7 +45,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -137,7 +138,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -226,17 +231,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -380,8 +385,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -431,7 +436,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -460,6 +465,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr ""
@@ -469,54 +482,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -823,7 +837,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -901,8 +915,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -940,7 +954,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -949,22 +963,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -986,7 +1008,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1004,20 +1026,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1069,10 +1091,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1088,14 +1110,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1114,7 +1136,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1167,23 +1189,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2074,19 +2096,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2094,21 +2188,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2193,19 +2363,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2315,11 +2485,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2665,11 +2830,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2700,7 +2860,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2735,7 +2895,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2752,20 +2912,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -2825,7 +2985,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -2838,12 +2998,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -2873,7 +3033,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -2952,22 +3112,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3065,13 +3225,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3085,112 +3245,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3198,138 +3375,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr ""
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3412,43 +3581,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3460,15 +3643,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3480,57 +3663,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3703,10 +3883,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3738,7 +3914,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -3864,7 +4040,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4133,7 +4309,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4155,10 +4331,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4182,7 +4354,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4248,7 +4420,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4625,7 +4797,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4677,65 +4849,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -4942,26 +5114,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5027,155 +5204,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5285,10 +5511,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/pt/messages.po b/src/frontend/src/locales/pt/messages.po
index 65622e3dc97f..5be4f70fc5ad 100644
--- a/src/frontend/src/locales/pt/messages.po
+++ b/src/frontend/src/locales/pt/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr "Remover imagem associada a este item?"
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr "Remover"
 
@@ -49,7 +50,7 @@ msgstr "Remover"
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr "Virtual"
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr "Atualizar"
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Excluir"
 
@@ -404,8 +409,8 @@ msgstr "Servidor"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Nome: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "Estado: <0>funcionário</0> ({0}), <1>extensões</1>{1}"
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr "Carregando"
 msgid "No results found"
 msgstr "Nenhum resultado encontrado"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr "Nenhum resultado encontrado"
 msgid "Thumbnail"
 msgstr "Miniatura"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr "Ações de código de barras"
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr "Visualizar"
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr "Ver código de barras"
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr "Vincular Código de Barras"
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr "Vincular código de barras personalizado"
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr "Desvincular Código de Barras"
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr "Desvincular código de barras personalizado"
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Editar"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr "Apagar item"
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr "Duplicar"
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr "Duplicar item"
 
@@ -847,7 +861,7 @@ msgstr "Configurações de conta"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr "Configurações do Sistema"
 
@@ -933,8 +947,8 @@ msgstr "Marcar como lido"
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Categorias de Peça"
 
@@ -972,7 +986,7 @@ msgstr "Não há resultados disponíveis para a pesquisa"
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Locais de estoque"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr "Modelo desconhecido: {model}"
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "Peça"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Peças"
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr "Fornecedor da Peça"
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr "Peças do Fabricante"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr "Categoria da Peça"
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr "Item de estoque"
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Itens de Estoque"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr "Pedido de Compra"
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Pedidos de compra"
@@ -1120,14 +1142,14 @@ msgstr "Linhas do Pedido de Compra"
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr "Pedido de Venda"
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Pedidos de vendas"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr "Pedido de Devolução"
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr "Remessa"
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr "Estoque"
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr "Número de Série"
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr "Quantidade"
 
@@ -2182,19 +2204,91 @@ msgstr "Categoria de peça parental"
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr "Adicionar quantidade dada como pacotes e não itens individuais"
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr "Inserir quantidade inicial deste item de estoque"
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr "Números de Série"
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr "Insira o número de série para novo estoque (ou deixe em branco)"
 
@@ -2202,21 +2296,97 @@ msgstr "Insira o número de série para novo estoque (ou deixe em branco)"
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr "Adicionar Item do Estoque"
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr "Editar Item do Estoque"
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr "Item de estoque atualizado"
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr "Em Estoque"
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr "Ações"
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr "Adicionar"
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr "Contar"
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr "Transferir Estoque"
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr "Contar Estoque"
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr "Local de estoque pai"
 
@@ -2305,19 +2475,19 @@ msgstr "Código de retorno inválido"
 msgid "Server returned status {returnCode}"
 msgstr "O servidor retornou o estado {returnCode}"
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr "Item Criado"
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr "Item Atualizado"
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr "Item Excluído"
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr "Tem certeza que deseja remover este item?"
 
@@ -2555,11 +2725,6 @@ msgstr "Múltiplos tipos de objetos selecionados"
 msgid "Actions for {0}"
 msgstr "Ações para {0}"
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr "Contar"
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr "Escanear Página"
@@ -2905,11 +3070,6 @@ msgstr "Etiquetas"
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr "Lista de Materiais"
 
@@ -2975,7 +3135,7 @@ msgstr "Códigos de barras"
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr "Preços"
 
@@ -2992,20 +3152,20 @@ msgstr "Taxas de Câmbio"
 msgid "Reporting"
 msgstr "Relatórios"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr "Balanço"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Ordens de Produções"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr "Mudar para Configuração de Usuário"
 
@@ -3069,7 +3229,7 @@ msgstr "Marcar como não lido"
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Estado"
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr "Pedido de Produção Filhos"
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr "Anexos"
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr "Anotações"
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr "Ações da Empresa"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr "Parâmetros"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr "Fornecedores"
@@ -3329,112 +3489,129 @@ msgstr "Peça do Fabricante"
 msgid "Received Stock"
 msgstr "Estoque Recebido"
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr "Caminho"
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr "Estrutural"
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr "Editar Categoria da Peça"
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr "Variante de"
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr "Categoria"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr "Local Padrão"
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr "IPN"
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr "Revisão"
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr "Unidades"
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr "Palavras-chave"
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr "Link"
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr "Estoque Disponível"
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr "Em Estoque"
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr "Estoque Mínimo"
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr "No pedido"
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr "Alocado para Pedidos de Construção"
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr "Alocado para Pedidos de Venda"
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr "Pode Produzir"
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr "Produzindo"
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr "Produzindo"
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr "Ativo"
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr "Peça Montada"
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr "Peça Rastreável"
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr "Criado em"
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr "Fornecedor Padrão"
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
-msgstr "Faixa de Preço"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
+msgstr "Fornecedor Padrão"
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr "Faixa de Preço"
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr "Último Balanço"
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr "Variantes"
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr "Alocações"
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr "Usado em"
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr "Fabricantes"
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr "Agendamento"
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr "Testar Modelos"
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr "Peças Relacionadas"
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr "Editar Peça"
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr "Ações de Estoque"
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr "Contar Estoque"
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr "Contagem do estoque"
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr "Transferir Estoque"
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr "Transferir estoque de peça"
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr "Ações da Peça"
 
@@ -3660,43 +3829,57 @@ msgstr "Clientes"
 msgid "Pending Shipments"
 msgstr "Envios Pendentes"
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr "Editar Local de Estoque"
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr "Peça base"
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr "Disponível"
 
@@ -3708,15 +3891,15 @@ msgstr "Disponível"
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr "Rastreamento de Estoque"
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr "Dados de Teste"
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr "Itens Instalados"
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr "Itens Filhos"
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr "Operações de Estoque"
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr "Contagem de estoque"
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr "Adicionar"
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr "Adicionar estoque"
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr "Remover estoque"
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr "Transferir"
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr "Transferir estoque"
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr "Duplicar item de estoque"
 
@@ -3951,10 +4131,6 @@ msgstr "Atualizar dados"
 msgid "Table filters"
 msgstr "Filtros da Tabela"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr "Ações"
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr "Este item da BOM é definido para um pai diferente"
@@ -3986,7 +4162,7 @@ msgstr "Incluir estoque de variantes"
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr "Informação do Estoque"
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr "Em produção"
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr "Nenhum estoque disponível"
 
@@ -4381,7 +4557,7 @@ msgstr "Idade"
 msgid "Message"
 msgstr "Mensagem"
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr "Mostrar categorias estruturais"
 msgid "New Part Category"
 msgstr "Nova Categoria de Peça"
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr "Editar Categoria da Peça"
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr "Adicionar Categoria de Peça"
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr "Adiciona parâmetro"
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr "Incluir Variantes"
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr "Filtrar por peça em estado ativo"
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr "Montagem"
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr "Amostra"
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr "Instalado"
 
@@ -4925,65 +5097,65 @@ msgstr "Peça do Fabricante excluída"
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr "Tem certeza de que deseja remover esta peça do fabricante?"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr "Descrição da Peça"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr "Quantidade de embalagens"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr "Quantidade Total"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr "Recebido"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr "Código do Fornecedor"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr "Link do Fornecedor"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr "Código do Fabricante"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr "Preço Unitário"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr "Destino"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr "Adicionar Item de Linha"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr "Editar Item de Linha"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr "Excluir Item de Linha"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr "Receber item de linha"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr "Adicionar item de linha"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr "Receber itens"
 
@@ -5190,26 +5362,31 @@ msgstr "Última Execução"
 msgid "Next Run"
 msgstr "Próxima Execução"
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr "Usuário com o id {id} não encontrado"
@@ -5275,155 +5452,204 @@ msgstr "Usuário adicionado"
 msgid "Edit user"
 msgstr "Editar usuário"
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr "Este item de estoque está em produção"
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr "Este item em estoque foi reservado para um pedido"
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr "Este item em estoque foi reservado para um cliente"
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr "Este item em estoque foi instalado em outro item de estoque"
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr "Este item de estoque foi consumido por um pedido de produção"
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr "Este item de estoque expirou"
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr "Este item de estoque está velho"
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr "Este item de estoque está totalmente alocado"
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr "Este item de estoque está parcialmente alocado"
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr "Este item de estoque foi esgotado"
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr "Mostrar estoque de peças ativas"
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr "Filtrar por estado do estoque"
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr "Mostrar estoque para peças montadas"
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr "Alocado"
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr "Mostrar itens que foram alocados"
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr "Mostrar itens que estão disponíveis"
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr "Incluir Sublocais"
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr "Incluir estoque em sublocais"
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr "Esgotado"
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr "Mostrar itens de estoque esgotados"
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr "Mostrar itens que estão em estoque"
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr "Em Produção"
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr "Mostrar itens que estão em produção"
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr "Incluir itens de estoque para peças variantes"
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr "Mostrar itens de estoque que estão instalados em outros itens"
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr "Enviar para Cliente"
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr "Mostrar itens enviados para um cliente"
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr "É Serializado"
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr "Mostrar itens com um número de série"
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr "Possuí Código de Lote"
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr "Mostrar itens com um código de lote"
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr "Monitorado"
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr "Mostrar itens monitorados"
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr "Tem Preço de Compra"
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr "Mostrar itens com preço de compra"
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr "Localização Externa"
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr "Mostrar itens com localização externa"
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr "Tem Tipo de localização"
 msgid "Add Stock Location"
 msgstr "Adicionar Local de Estoque"
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr "Editar Local de Estoque"
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr "Visualização móvel detectada"
diff --git a/src/frontend/src/locales/ru/messages.po b/src/frontend/src/locales/ru/messages.po
index a35d38c12746..27a60550f8f6 100644
--- a/src/frontend/src/locales/ru/messages.po
+++ b/src/frontend/src/locales/ru/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr "Удалить связанное изображение?"
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr "Удалить"
 
@@ -49,7 +50,7 @@ msgstr "Удалить"
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr "Обновить"
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Удалить"
 
@@ -404,8 +409,8 @@ msgstr "Узел"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Название: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "Состояние: <0>рабочий </0> ({0}), <1>плагины</1>{1}"
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr "Загрузка"
 msgid "No results found"
 msgstr "Ничего не найдено"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr "Ничего не найдено"
 msgid "Thumbnail"
 msgstr "Миниатюра"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Изменить"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr "Настройки аккаунта"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr "Пометить как прочитанное"
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Категории деталей"
 
@@ -972,7 +986,7 @@ msgstr "Нет доступных результатов для поисково
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Места хранения"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr "Неизвестная модель: {model}"
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Детали"
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr "Детали производителей"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Складские позиции"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Заказы на закупку"
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Заказы на продажу"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr "Сканировать страницу"
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Заказы на сборку"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/sk/messages.po b/src/frontend/src/locales/sk/messages.po
index da831abb838b..335d795f2716 100644
--- a/src/frontend/src/locales/sk/messages.po
+++ b/src/frontend/src/locales/sk/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/sl/messages.po b/src/frontend/src/locales/sl/messages.po
index 0bfbf876e9bf..6fd82e04a81f 100644
--- a/src/frontend/src/locales/sl/messages.po
+++ b/src/frontend/src/locales/sl/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/sr/messages.po b/src/frontend/src/locales/sr/messages.po
index 38c831cc688e..ce47d1c0170a 100644
--- a/src/frontend/src/locales/sr/messages.po
+++ b/src/frontend/src/locales/sr/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr "Obnovi"
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Obriši"
 
@@ -404,8 +409,8 @@ msgstr "Host"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Naziv: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "Status: <0>worker</0> ({0}), <1>plugins</1>{1}"
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr "Učitavanje"
 msgid "No results found"
 msgstr "Nema pronađenih rezultata"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr "Nema pronađenih rezultata"
 msgid "Thumbnail"
 msgstr "Sličice"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr "Akcije Barkoda"
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr "Vid"
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr "Pogledaj barkod"
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr "Link Barkoda"
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr "Linkuj prilagođeni barkod"
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr "Prekini vezu Barkoda"
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr "Prekini link prilagođenog barkoda"
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Izmeni"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr "Obriši stavku"
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr "Dupliciraj"
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr "Dupliciraj stavku"
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/sv/messages.po b/src/frontend/src/locales/sv/messages.po
index 22dd6a090779..53bd95a46953 100644
--- a/src/frontend/src/locales/sv/messages.po
+++ b/src/frontend/src/locales/sv/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr "Virtuell"
 msgid "Code"
 msgstr "Kod"
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Radera"
 
@@ -404,8 +409,8 @@ msgstr "Värd"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Namn: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr "Inga resultat hittades"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr "Inga resultat hittades"
 msgid "Thumbnail"
 msgstr "Miniatyrbild"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Redigera"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr "Kontoinställningar"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Artikelkategorier"
 
@@ -972,7 +986,7 @@ msgstr "Inga resultat tillgängliga för sökfrågan"
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Lagerplats"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "Artkel"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Artiklar"
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr "Tillverkarens artiklar"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Artikel i lager"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Inköpsorder"
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Försäljningsorder"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr "Lagersaldo"
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr "Antal"
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr "Serienummer"
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr "Åtgärder"
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr "Etiketter"
 msgid "Label"
 msgstr "Etikett"
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr "Streckkoder"
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Byggordrar"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Status"
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr "Parametrar"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr "Kategori"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr "IAN"
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr "Enheter"
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr "Länk"
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr "Aktiv"
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
-msgstr "Prisintervall"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
+msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr "Prisintervall"
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr "Uppdatera data"
 msgid "Table filters"
 msgstr "Tabellfilter"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr "Åtgärder"
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr "Filtrera på aktiv artiklestatus"
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr "Montering"
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr "Redigera användare"
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr "Mobil vy upptäckt"
diff --git a/src/frontend/src/locales/th/messages.po b/src/frontend/src/locales/th/messages.po
index bed30815cfba..c386fe6534b2 100644
--- a/src/frontend/src/locales/th/messages.po
+++ b/src/frontend/src/locales/th/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -972,7 +986,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/tr/messages.po b/src/frontend/src/locales/tr/messages.po
index deeb71aa6cdb..5d3a0b2e4ad0 100644
--- a/src/frontend/src/locales/tr/messages.po
+++ b/src/frontend/src/locales/tr/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr "Sanal"
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -404,8 +409,8 @@ msgstr "Sunucu"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "İsim: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "Durum: <0>worker</0> ({0}), <1>eklenti</1>{1}"
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr "Yükleniyor"
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr "Küçük resim"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -847,7 +861,7 @@ msgstr "Hesap ayarları"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -933,8 +947,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Parça Kategorileri"
 
@@ -972,7 +986,7 @@ msgstr "Arama sorgusu için sonuç yok"
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Stok Konumları"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "Parça"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Parçalar"
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr "Üretici Parçaları"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Stok Kalemleri"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Satın Alma Emirleri"
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Satış Emirleri"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr "Stok"
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr "Miktar"
 
@@ -2182,19 +2204,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2202,21 +2296,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr "Eylemler"
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2905,11 +3070,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2975,7 +3135,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2992,20 +3152,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Yapım İşi Emirleri"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -3069,7 +3229,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Durum"
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr "Kategori"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr "DPN"
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr "Birim"
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr "Bağlantı"
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr "Aktif"
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
-msgstr "Fiyat Aralığı"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
+msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr "Fiyat Aralığı"
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3708,15 +3891,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3951,10 +4131,6 @@ msgstr "Veriyi yenile"
 msgid "Table filters"
 msgstr "Tablo filtreleri"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr "Eylemler"
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr "Parçanın aktiflik durumuna göre filtrele"
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr "Montaj"
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/vi/messages.po b/src/frontend/src/locales/vi/messages.po
index b3fce7be859f..5ab3950b0966 100644
--- a/src/frontend/src/locales/vi/messages.po
+++ b/src/frontend/src/locales/vi/messages.po
@@ -39,9 +39,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -49,7 +50,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -142,7 +143,11 @@ msgstr "Ảo"
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -231,17 +236,17 @@ msgid "Update"
 msgstr "Cập nhật"
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr "Xóa"
 
@@ -404,8 +409,8 @@ msgstr "Host"
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -455,7 +460,7 @@ msgstr "Tên: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "Trạng thái: <0>worker</0> ({0}), <1>plugins</1>{1}"
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -484,6 +489,14 @@ msgstr "Đang tải"
 msgid "No results found"
 msgstr "Không có kết quả nào được tìm thấy"
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr "Select image"
@@ -493,54 +506,55 @@ msgstr "Không có kết quả nào được tìm thấy"
 msgid "Thumbnail"
 msgstr "Ảnh thu nhỏ"
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr "Chức năng mã vạch"
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr "Xem"
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr "Xem mã vạch"
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr "Liên kết mã vạch"
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr "Liên kết mã vạch tùy chỉnh"
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr "Gỡ liên kết mã vạch"
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr "Gỡ bỏ mã vạch tùy chỉnh"
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr "Sửa"
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr "Xoá mặt hàng"
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr "Nhân bản"
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr "Nhân bản hàng hóa"
 
@@ -847,7 +861,7 @@ msgstr "Cài đặt tài khoản"
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr "Thiết lập hệ thống"
 
@@ -933,8 +947,8 @@ msgstr "Đánh dấu đã đọc"
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr "Danh mục phụ kiện"
 
@@ -972,7 +986,7 @@ msgstr "Không có kết quả nào được tìm thấy với truy vấn tìm k
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr "Vị trí kho hàng"
 
@@ -981,22 +995,30 @@ msgid "Unknown model: {model}"
 msgstr "Model không rõ: {model}"
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr "Phụ kiện"
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr "Phụ tùng"
 
@@ -1018,7 +1040,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr "Phụ kiện nhà cung cấp"
@@ -1036,20 +1058,20 @@ msgid "Manufacturer Parts"
 msgstr "Nhà sản xuất phụ kiện"
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr "Danh mục phụ kiện"
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr "Hàng trong kho"
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr "Hàng trong kho"
 
@@ -1101,10 +1123,10 @@ msgid "Purchase Order"
 msgstr "Đơn đặt mua"
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr "Đơn hàng mua"
@@ -1120,14 +1142,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr "Đơn đặt bán"
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr "Đơn hàng bán"
@@ -1146,7 +1168,7 @@ msgid "Return Order"
 msgstr "Đơn hàng trả lại"
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1199,23 +1221,23 @@ msgstr "Lô hàng"
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr "Kho hàng"
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr "Số lượng"
 
@@ -2182,19 +2204,91 @@ msgstr "Danh mục phụ kiện cha"
 #~ msgid "Part updated"
 #~ msgstr "Part updated"
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr "Thêm số lượng đã có theo gói thay vì các mục đơn lẻ"
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr "Nhập số lượng khởi đầu cho kho hàng này"
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr "Số sê-ri"
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr "Điền số sê-ri cho kho mới (hoặc để trống)"
 
@@ -2202,21 +2296,97 @@ msgstr "Điền số sê-ri cho kho mới (hoặc để trống)"
 #~ msgid "Create Stock Item"
 #~ msgstr "Create Stock Item"
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr "Sửa hàng trong kho"
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr "Kho hàng đã được cập nhật"
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr "Còn hàng"
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr "Chức năng"
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr "Thêm"
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr "Đếm"
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2305,19 +2475,19 @@ msgstr "Mã trả hàng không hợp lệ"
 msgid "Server returned status {returnCode}"
 msgstr "Mã phản hồi của máy chủ {returnCode}"
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2555,11 +2725,6 @@ msgstr "Đã chọn nhiều loại đối tượng"
 msgid "Actions for {0}"
 msgstr "Chức năng cho {0}"
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr "Đếm"
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr "Quét trang"
@@ -2905,11 +3070,6 @@ msgstr "Nhãn"
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2940,7 +3100,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr "Hóa đơn nguyên vật liệu"
 
@@ -2975,7 +3135,7 @@ msgstr "Mã vạch"
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr "Giá bán"
 
@@ -2992,20 +3152,20 @@ msgstr "Tỷ giá hối đoái"
 msgid "Reporting"
 msgstr "Báo cáo"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr "Kiểm kê"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr "Đơn đặt bản dựng"
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr "Chuyển sang thiết lập người dùng"
 
@@ -3069,7 +3229,7 @@ msgstr "Đánh dấu chưa đọc"
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr "Trạng thái"
 
@@ -3082,12 +3242,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -3117,7 +3277,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -3196,22 +3356,22 @@ msgstr "Đơn đặt bản dựng con"
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr "Đính kèm"
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr "Ghi chú"
 
@@ -3309,13 +3469,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr "Thông số"
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr "Nhà cung cấp"
@@ -3329,112 +3489,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr "Đường dẫn"
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr "Cấu trúc"
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr "Danh mục"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr "IPN"
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr "Đơn vị"
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr "Liên kết"
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr "Còn hàng"
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3442,138 +3619,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr "Hoạt động"
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr "Edit part"
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
-msgstr "Khoảng giá"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
+msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr "Duplicate part"
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr "Khoảng giá"
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr "Delete part"
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr "Biến thể"
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr "Phân bổ"
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr "Sử dụng trong"
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr "Mẫu thử nghiệm"
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr "Phụ kiện liên quan"
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr "Sửa phụ kiện"
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3660,43 +3829,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr "Sản phẩm cơ bản"
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr "Có sẵn"
 
@@ -3708,15 +3891,15 @@ msgstr "Có sẵn"
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr "Unlink custom barcode from stock item"
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3728,57 +3911,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr "Delete stock item"
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr "Theo dõi tồn kho"
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr "Mục đã cài đặt"
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr "Mục con"
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr "Đếm hàng"
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr "Thêm"
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr "Thêm hàng"
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr "Xóa hàng"
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr "Chuyển"
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr "Chuyển giao hàng"
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr "Nhân bản mặt hàng"
 
@@ -3951,10 +4131,6 @@ msgstr "Làm mới dữ liệu"
 msgid "Table filters"
 msgstr "Bộ lọc bảng"
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr "Chức năng"
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3986,7 +4162,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -4112,7 +4288,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4381,7 +4557,7 @@ msgstr "Tuổi"
 msgid "Message"
 msgstr "Nội dụng tin nhắn"
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4403,10 +4579,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4430,7 +4602,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr "Bao gồm các biến thể"
 
@@ -4496,7 +4668,7 @@ msgid "Filter by part active status"
 msgstr "Lọc theo trạng thái mở phụ kiện"
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr "Lắp ráp"
 
@@ -4873,7 +5045,7 @@ msgid "Sample"
 msgstr "Mẫu"
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr "Đã cài đặt"
 
@@ -4925,65 +5097,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr "Mô tả sản phẩm"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr "Số lượng gói"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr "Tổng số lượng"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr "Đã nhận"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr "Mã nhà cung cấp"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr "Liên kết nhà cung cấp"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr "Mã nhà sản xuất"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr "Đơn giá"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr "Đích đến"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr "Thêm hạng mục"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr "Sửa hạng mục"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr "Nhận hạng mục"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr "Thêm hạng mục"
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr "Nhận hàng hóa"
 
@@ -5190,26 +5362,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5275,155 +5452,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5533,10 +5759,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr "Khung nhìn màn hình di dộng đã được nhận dạng"
diff --git a/src/frontend/src/locales/zh-hans/messages.po b/src/frontend/src/locales/zh-hans/messages.po
index 51cc94ba3eda..d3848f984d88 100644
--- a/src/frontend/src/locales/zh-hans/messages.po
+++ b/src/frontend/src/locales/zh-hans/messages.po
@@ -34,9 +34,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -44,7 +45,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -137,7 +138,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -226,17 +231,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -380,8 +385,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -431,7 +436,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -460,6 +465,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr ""
@@ -469,54 +482,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -823,7 +837,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -901,8 +915,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -940,7 +954,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -949,22 +963,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -986,7 +1008,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1004,20 +1026,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1069,10 +1091,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1088,14 +1110,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1114,7 +1136,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1167,23 +1189,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2074,19 +2096,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2094,21 +2188,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2193,19 +2363,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2315,11 +2485,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2665,11 +2830,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2700,7 +2860,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2735,7 +2895,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2752,20 +2912,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -2825,7 +2985,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -2838,12 +2998,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -2873,7 +3033,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -2952,22 +3112,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3065,13 +3225,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3085,112 +3245,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3198,138 +3375,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr ""
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3412,43 +3581,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3460,15 +3643,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3480,57 +3663,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3703,10 +3883,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3738,7 +3914,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -3864,7 +4040,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4133,7 +4309,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4155,10 +4331,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4182,7 +4354,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4248,7 +4420,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4625,7 +4797,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4677,65 +4849,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -4942,26 +5114,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5027,155 +5204,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5285,10 +5511,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/zh-hant/messages.po b/src/frontend/src/locales/zh-hant/messages.po
index a9c3d9c22a2f..7eea8ec5dc13 100644
--- a/src/frontend/src/locales/zh-hant/messages.po
+++ b/src/frontend/src/locales/zh-hant/messages.po
@@ -34,9 +34,10 @@ msgid "Remove the associated image from this item?"
 msgstr ""
 
 #: src/components/details/DetailsImage.tsx:69
+#: src/forms/StockForms.tsx:450
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:192
 #: src/pages/Index/Settings/AccountSettings/SecurityContent.tsx:299
-#: src/pages/stock/StockDetail.tsx:343
+#: src/pages/stock/StockDetail.tsx:368
 msgid "Remove"
 msgstr ""
 
@@ -44,7 +45,7 @@ msgstr ""
 #: src/components/editors/TemplateEditor/TemplateEditor.tsx:163
 #: src/contexts/ThemeContext.tsx:64
 #: src/functions/forms.tsx:196
-#: src/hooks/UseForm.tsx:38
+#: src/hooks/UseForm.tsx:39
 #: src/tables/FilterSelectDrawer.tsx:214
 #: src/tables/InvenTreeTable.tsx:456
 #: src/tables/plugin/PluginListTable.tsx:361
@@ -137,7 +138,11 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:73
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:44
+msgid "Failed to parse error response from server."
+msgstr ""
+
+#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:82
 msgid "Preview not available, click \"Reload Preview\"."
 msgstr ""
 
@@ -226,17 +231,17 @@ msgid "Update"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:507
-#: src/components/items/ActionDropdown.tsx:192
+#: src/components/items/ActionDropdown.tsx:199
 #: src/functions/forms.tsx:299
-#: src/hooks/UseForm.tsx:120
+#: src/hooks/UseForm.tsx:121
 #: src/pages/Index/Scan.tsx:332
 #: src/pages/Notifications.tsx:123
 #: src/tables/InvenTreeTable.tsx:455
 #: src/tables/RowActions.tsx:71
 #: src/tables/plugin/PluginListTable.tsx:473
-#: src/tables/settings/TemplateTable.tsx:104
-#: src/tables/settings/TemplateTable.tsx:153
-#: src/tables/settings/TemplateTable.tsx:235
+#: src/tables/settings/TemplateTable.tsx:105
+#: src/tables/settings/TemplateTable.tsx:154
+#: src/tables/settings/TemplateTable.tsx:236
 msgid "Delete"
 msgstr ""
 
@@ -380,8 +385,8 @@ msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:42
 #: src/components/forms/HostOptionsForm.tsx:69
-#: src/pages/part/CategoryDetail.tsx:60
-#: src/pages/stock/LocationDetail.tsx:50
+#: src/pages/part/CategoryDetail.tsx:71
+#: src/pages/stock/LocationDetail.tsx:78
 #: src/tables/machine/MachineTypeTable.tsx:65
 #: src/tables/machine/MachineTypeTable.tsx:106
 #: src/tables/machine/MachineTypeTable.tsx:210
@@ -431,7 +436,7 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
-#: src/components/forms/fields/ApiFormField.tsx:271
+#: src/components/forms/fields/ApiFormField.tsx:282
 #: src/components/nav/SearchDrawer.tsx:411
 #: src/components/widgets/MarkdownEditor.tsx:108
 #: src/components/widgets/MarkdownEditor.tsx:154
@@ -460,6 +465,14 @@ msgstr ""
 msgid "No results found"
 msgstr ""
 
+#: src/components/forms/fields/TableField.tsx:49
+msgid "modelRenderer entry required for tables"
+msgstr ""
+
+#: src/components/forms/fields/TableField.tsx:72
+msgid "No entries available"
+msgstr ""
+
 #: src/components/images/DetailsImage.tsx:252
 #~ msgid "Select image"
 #~ msgstr ""
@@ -469,54 +482,55 @@ msgstr ""
 msgid "Thumbnail"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:103
+#: src/components/items/ActionDropdown.tsx:110
 #: src/pages/build/BuildDetail.tsx:298
 msgid "Barcode Actions"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:120
+#: src/components/items/ActionDropdown.tsx:127
 msgid "View"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:121
+#: src/components/items/ActionDropdown.tsx:128
 msgid "View barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:137
+#: src/components/items/ActionDropdown.tsx:144
 msgid "Link Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:138
+#: src/components/items/ActionDropdown.tsx:145
 msgid "Link custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:154
+#: src/components/items/ActionDropdown.tsx:161
+#: src/forms/PurchaseOrderForms.tsx:356
 msgid "Unlink Barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:155
+#: src/components/items/ActionDropdown.tsx:162
 msgid "Unlink custom barcode"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:173
+#: src/components/items/ActionDropdown.tsx:180
 #: src/tables/RowActions.tsx:51
-#: src/tables/settings/TemplateTable.tsx:86
-#: src/tables/settings/TemplateTable.tsx:149
-#: src/tables/settings/TemplateTable.tsx:279
+#: src/tables/settings/TemplateTable.tsx:87
+#: src/tables/settings/TemplateTable.tsx:150
+#: src/tables/settings/TemplateTable.tsx:287
 msgid "Edit"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:193
+#: src/components/items/ActionDropdown.tsx:200
 msgid "Delete item"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:211
-#: src/pages/stock/StockDetail.tsx:360
+#: src/components/items/ActionDropdown.tsx:218
+#: src/pages/stock/StockDetail.tsx:393
 #: src/tables/RowActions.tsx:31
 msgid "Duplicate"
 msgstr ""
 
-#: src/components/items/ActionDropdown.tsx:212
+#: src/components/items/ActionDropdown.tsx:219
 msgid "Duplicate item"
 msgstr ""
 
@@ -823,7 +837,7 @@ msgstr ""
 
 #: src/components/nav/MainMenu.tsx:50
 #: src/defaults/menuItems.tsx:58
-#: src/pages/Index/Settings/SystemSettings.tsx:287
+#: src/pages/Index/Settings/SystemSettings.tsx:288
 msgid "System Settings"
 msgstr ""
 
@@ -901,8 +915,8 @@ msgstr ""
 
 #: src/components/nav/PartCategoryTree.tsx:153
 #: src/components/render/ModelType.tsx:60
-#: src/pages/Index/Settings/SystemSettings.tsx:163
-#: src/pages/part/CategoryDetail.tsx:147
+#: src/pages/Index/Settings/SystemSettings.tsx:164
+#: src/pages/part/CategoryDetail.tsx:197
 msgid "Part Categories"
 msgstr ""
 
@@ -940,7 +954,7 @@ msgstr ""
 
 #: src/components/nav/StockLocationTree.tsx:93
 #: src/components/render/ModelType.tsx:76
-#: src/pages/stock/LocationDetail.tsx:139
+#: src/pages/stock/LocationDetail.tsx:167
 msgid "Stock Locations"
 msgstr ""
 
@@ -949,22 +963,30 @@ msgid "Unknown model: {model}"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:21
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:49
 #: src/pages/build/BuildDetail.tsx:79
-#: src/pages/part/PartDetail.tsx:696
+#: src/pages/part/PartDetail.tsx:729
 #: src/tables/part/RelatedPartTable.tsx:45
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:59
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:72
 msgid "Part"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:22
 #: src/defaults/links.tsx:28
 #: src/defaults/menuItems.tsx:33
-#: src/pages/Index/Settings/SystemSettings.tsx:168
-#: src/pages/part/CategoryDetail.tsx:92
-#: src/pages/part/CategoryDetail.tsx:133
-#: src/pages/part/CategoryDetail.tsx:163
-#: src/pages/part/PartDetail.tsx:605
+#: src/pages/Index/Settings/SystemSettings.tsx:169
+#: src/pages/part/CategoryDetail.tsx:103
+#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:213
+#: src/pages/part/PartDetail.tsx:617
 msgid "Parts"
 msgstr ""
 
@@ -986,7 +1008,7 @@ msgstr ""
 
 #: src/components/render/ModelType.tsx:43
 #: src/pages/company/SupplierPartDetail.tsx:78
-#: src/pages/stock/StockDetail.tsx:147
+#: src/pages/stock/StockDetail.tsx:151
 #: src/tables/purchasing/SupplierPartTable.tsx:66
 msgid "Supplier Part"
 msgstr ""
@@ -1004,20 +1026,20 @@ msgid "Manufacturer Parts"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:59
-#: src/pages/part/CategoryDetail.tsx:183
+#: src/pages/part/CategoryDetail.tsx:235
 msgid "Part Category"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:67
-#: src/pages/stock/StockDetail.tsx:385
+#: src/pages/stock/StockDetail.tsx:414
 msgid "Stock Item"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:68
 #: src/pages/company/CompanyDetail.tsx:196
-#: src/pages/stock/LocationDetail.tsx:83
-#: src/pages/stock/LocationDetail.tsx:127
-#: src/pages/stock/LocationDetail.tsx:167
+#: src/pages/stock/LocationDetail.tsx:111
+#: src/pages/stock/LocationDetail.tsx:155
+#: src/pages/stock/LocationDetail.tsx:308
 msgid "Stock Items"
 msgstr ""
 
@@ -1069,10 +1091,10 @@ msgid "Purchase Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:112
-#: src/pages/Index/Settings/SystemSettings.tsx:239
+#: src/pages/Index/Settings/SystemSettings.tsx:240
 #: src/pages/company/CompanyDetail.tsx:189
 #: src/pages/company/SupplierPartDetail.tsx:45
-#: src/pages/part/PartDetail.tsx:538
+#: src/pages/part/PartDetail.tsx:550
 #: src/pages/purchasing/PurchasingIndex.tsx:20
 msgid "Purchase Orders"
 msgstr ""
@@ -1088,14 +1110,14 @@ msgstr ""
 #: src/components/render/ModelType.tsx:124
 #: src/pages/build/BuildDetail.tsx:127
 #: src/pages/sales/SalesOrderDetail.tsx:251
-#: src/pages/stock/StockDetail.tsx:176
+#: src/pages/stock/StockDetail.tsx:180
 msgid "Sales Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:125
-#: src/pages/Index/Settings/SystemSettings.tsx:253
+#: src/pages/Index/Settings/SystemSettings.tsx:254
 #: src/pages/company/CompanyDetail.tsx:205
-#: src/pages/part/PartDetail.tsx:544
+#: src/pages/part/PartDetail.tsx:556
 #: src/pages/sales/SalesIndex.tsx:21
 msgid "Sales Orders"
 msgstr ""
@@ -1114,7 +1136,7 @@ msgid "Return Order"
 msgstr ""
 
 #: src/components/render/ModelType.tsx:140
-#: src/pages/Index/Settings/SystemSettings.tsx:267
+#: src/pages/Index/Settings/SystemSettings.tsx:268
 #: src/pages/company/CompanyDetail.tsx:212
 #: src/pages/sales/SalesIndex.tsx:27
 msgid "Return Orders"
@@ -1167,23 +1189,23 @@ msgstr ""
 #: src/components/render/Part.tsx:10
 #: src/defaults/links.tsx:29
 #: src/defaults/menuItems.tsx:38
-#: src/pages/Index/Settings/SystemSettings.tsx:199
-#: src/pages/part/PartDetail.tsx:461
-#: src/pages/stock/LocationDetail.tsx:148
-#: src/pages/stock/StockDetail.tsx:300
-#: src/tables/stock/StockItemTable.tsx:44
+#: src/pages/Index/Settings/SystemSettings.tsx:200
+#: src/pages/part/PartDetail.tsx:473
+#: src/pages/stock/LocationDetail.tsx:288
+#: src/pages/stock/StockDetail.tsx:304
+#: src/tables/stock/StockItemTable.tsx:57
 msgid "Stock"
 msgstr ""
 
 #: src/components/render/Stock.tsx:26
-#: src/pages/stock/StockDetail.tsx:131
+#: src/pages/stock/StockDetail.tsx:135
 msgid "Serial Number"
 msgstr ""
 
 #: src/components/render/Stock.tsx:28
-#: src/pages/stock/StockDetail.tsx:126
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:81
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:109
+#: src/pages/stock/StockDetail.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:122
 msgid "Quantity"
 msgstr ""
 
@@ -2074,19 +2096,91 @@ msgstr ""
 #~ msgid "Part updated"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:54
+#: src/forms/PurchaseOrderForms.tsx:246
+msgid "Choose Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:254
+msgid "Item Destination selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:263
+msgid "Part category default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:273
+msgid "Received stock location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:278
+msgid "Default location selected"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:289
+#: src/forms/PurchaseOrderForms.tsx:365
+msgid "Scan Barcode"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:333
+msgid "Set Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:340
+msgid "Assign Batch Code{0}"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:349
+msgid "Change Status"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:374
+#: src/forms/StockForms.tsx:359
+msgid "Remove item from list"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:399
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
+#: src/pages/stock/StockDetail.tsx:159
+msgid "Location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:415
+msgid "Store at default location"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:428
+msgid "Store at line item destination"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:438
+msgid "Store with already received stock"
+msgstr ""
+
+#: src/forms/PurchaseOrderForms.tsx:647
+msgid "Receive line items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:70
 msgid "Add given quantity as packs instead of individual items"
 msgstr ""
 
-#: src/forms/StockForms.tsx:65
+#: src/forms/StockForms.tsx:81
 msgid "Enter initial quantity for this stock item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:70
+#: src/forms/StockForms.tsx:86
 msgid "Serial Numbers"
 msgstr ""
 
-#: src/forms/StockForms.tsx:71
+#: src/forms/StockForms.tsx:87
 msgid "Enter serial numbers for new stock (or leave blank)"
 msgstr ""
 
@@ -2094,21 +2188,97 @@ msgstr ""
 #~ msgid "Create Stock Item"
 #~ msgstr ""
 
-#: src/forms/StockForms.tsx:120
-#: src/tables/stock/StockItemTable.tsx:344
-#: src/tables/stock/StockItemTable.tsx:361
+#: src/forms/StockForms.tsx:136
+#: src/tables/stock/StockItemTable.tsx:366
+#: src/tables/stock/StockItemTable.tsx:486
 msgid "Add Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:141
+#: src/forms/StockForms.tsx:157
 msgid "Edit Stock Item"
 msgstr ""
 
-#: src/forms/StockForms.tsx:142
+#: src/forms/StockForms.tsx:158
 msgid "Stock item updated"
 msgstr ""
 
-#: src/forms/StockForms.tsx:150
+#: src/forms/StockForms.tsx:348
+msgid "Move to default location"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+msgid "Move"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/pages/part/PartDetail.tsx:195
+#: src/tables/stock/StockItemTable.tsx:283
+msgid "In Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:416
+#: src/forms/StockForms.tsx:450
+#: src/forms/StockForms.tsx:479
+#: src/forms/StockForms.tsx:507
+#: src/forms/StockForms.tsx:538
+#: src/forms/StockForms.tsx:573
+#: src/forms/StockForms.tsx:615
+#: src/forms/StockForms.tsx:651
+#: src/tables/RowActions.tsx:151
+msgid "Actions"
+msgstr ""
+
+#: src/forms/StockForms.tsx:479
+#: src/pages/stock/StockDetail.tsx:360
+#: src/tables/settings/TemplateTable.tsx:266
+#: src/tables/stock/StockItemTestResultTable.tsx:305
+msgid "Add"
+msgstr ""
+
+#: src/forms/StockForms.tsx:507
+#: src/pages/Index/Scan.tsx:262
+#: src/pages/stock/StockDetail.tsx:350
+msgid "Count"
+msgstr ""
+
+#: src/forms/StockForms.tsx:740
+msgid "Add Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:749
+msgid "Remove Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:758
+#: src/pages/part/PartDetail.tsx:690
+msgid "Transfer Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:767
+#: src/pages/part/PartDetail.tsx:680
+msgid "Count Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:776
+msgid "Change Stock Status"
+msgstr ""
+
+#: src/forms/StockForms.tsx:785
+msgid "Merge Stock"
+msgstr ""
+
+#: src/forms/StockForms.tsx:804
+msgid "Delete Stock Items"
+msgstr ""
+
+#: src/forms/StockForms.tsx:811
 msgid "Parent stock location"
 msgstr ""
 
@@ -2193,19 +2363,19 @@ msgstr ""
 msgid "Server returned status {returnCode}"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:86
+#: src/hooks/UseForm.tsx:87
 msgid "Item Created"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:103
+#: src/hooks/UseForm.tsx:104
 msgid "Item Updated"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:122
+#: src/hooks/UseForm.tsx:123
 msgid "Item Deleted"
 msgstr ""
 
-#: src/hooks/UseForm.tsx:126
+#: src/hooks/UseForm.tsx:127
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
@@ -2315,11 +2485,6 @@ msgstr ""
 msgid "Actions for {0}"
 msgstr ""
 
-#: src/pages/Index/Scan.tsx:262
-#: src/pages/stock/StockDetail.tsx:333
-msgid "Count"
-msgstr ""
-
 #: src/pages/Index/Scan.tsx:276
 msgid "Scan Page"
 msgstr ""
@@ -2665,11 +2830,6 @@ msgstr ""
 msgid "Label"
 msgstr ""
 
-#: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:58
-#: src/pages/stock/StockDetail.tsx:155
-msgid "Location"
-msgstr ""
-
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:67
 msgid "Stock item"
 msgstr ""
@@ -2700,7 +2860,7 @@ msgid "Return order"
 msgstr ""
 
 #: src/pages/Index/Settings/AdminCenter/TemplateManagementPanel.tsx:135
-#: src/pages/part/PartDetail.tsx:486
+#: src/pages/part/PartDetail.tsx:498
 msgid "Bill of Materials"
 msgstr ""
 
@@ -2735,7 +2895,7 @@ msgstr ""
 
 #: src/pages/Index/Settings/SystemSettings.tsx:106
 #: src/pages/company/SupplierPartDetail.tsx:55
-#: src/pages/part/PartDetail.tsx:507
+#: src/pages/part/PartDetail.tsx:519
 msgid "Pricing"
 msgstr ""
 
@@ -2752,20 +2912,20 @@ msgstr ""
 msgid "Reporting"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:221
-#: src/pages/part/PartDetail.tsx:556
+#: src/pages/Index/Settings/SystemSettings.tsx:222
+#: src/pages/part/PartDetail.tsx:568
 msgid "Stocktake"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:226
+#: src/pages/Index/Settings/SystemSettings.tsx:227
 #: src/pages/build/BuildDetail.tsx:359
 #: src/pages/build/BuildIndex.tsx:14
-#: src/pages/part/PartDetail.tsx:493
+#: src/pages/part/PartDetail.tsx:505
 #: src/pages/sales/SalesOrderDetail.tsx:211
 msgid "Build Orders"
 msgstr ""
 
-#: src/pages/Index/Settings/SystemSettings.tsx:290
+#: src/pages/Index/Settings/SystemSettings.tsx:291
 msgid "Switch to User Setting"
 msgstr ""
 
@@ -2825,7 +2985,7 @@ msgstr ""
 #: src/tables/purchasing/PurchaseOrderTable.tsx:55
 #: src/tables/sales/ReturnOrderTable.tsx:45
 #: src/tables/sales/SalesOrderTable.tsx:52
-#: src/tables/stock/StockItemTable.tsx:239
+#: src/tables/stock/StockItemTable.tsx:252
 msgid "Status"
 msgstr ""
 
@@ -2838,12 +2998,12 @@ msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:96
 #: src/pages/company/CompanyDetail.tsx:84
-#: src/pages/part/CategoryDetail.tsx:74
-#: src/pages/part/PartDetail.tsx:111
+#: src/pages/part/CategoryDetail.tsx:85
+#: src/pages/part/PartDetail.tsx:116
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:102
 #: src/pages/sales/ReturnOrderDetail.tsx:68
 #: src/pages/sales/SalesOrderDetail.tsx:72
-#: src/pages/stock/LocationDetail.tsx:64
+#: src/pages/stock/LocationDetail.tsx:92
 #: src/tables/ColumnRenderers.tsx:52
 #: src/tables/machine/MachineTypeTable.tsx:69
 #: src/tables/machine/MachineTypeTable.tsx:109
@@ -2873,7 +3033,7 @@ msgid "Issued By"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:145
-#: src/pages/part/PartDetail.tsx:296
+#: src/pages/part/PartDetail.tsx:308
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:188
 #: src/pages/sales/ReturnOrderDetail.tsx:154
 #: src/pages/sales/SalesOrderDetail.tsx:158
@@ -2952,22 +3112,22 @@ msgstr ""
 #: src/pages/build/BuildDetail.tsx:258
 #: src/pages/company/CompanyDetail.tsx:244
 #: src/pages/company/ManufacturerPartDetail.tsx:68
-#: src/pages/part/PartDetail.tsx:578
+#: src/pages/part/PartDetail.tsx:590
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:244
 #: src/pages/sales/ReturnOrderDetail.tsx:197
 #: src/pages/sales/SalesOrderDetail.tsx:221
-#: src/pages/stock/StockDetail.tsx:273
+#: src/pages/stock/StockDetail.tsx:277
 msgid "Attachments"
 msgstr ""
 
 #: src/pages/build/BuildDetail.tsx:270
 #: src/pages/company/CompanyDetail.tsx:256
-#: src/pages/part/PartDetail.tsx:590
+#: src/pages/part/PartDetail.tsx:602
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:256
 #: src/pages/sales/ReturnOrderDetail.tsx:209
 #: src/pages/sales/SalesOrderDetail.tsx:233
-#: src/pages/stock/StockDetail.tsx:285
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:172
+#: src/pages/stock/StockDetail.tsx:289
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:185
 msgid "Notes"
 msgstr ""
 
@@ -3065,13 +3225,13 @@ msgid "Company Actions"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:42
-#: src/pages/part/CategoryDetail.tsx:153
-#: src/pages/part/PartDetail.tsx:455
+#: src/pages/part/CategoryDetail.tsx:203
+#: src/pages/part/PartDetail.tsx:467
 msgid "Parameters"
 msgstr ""
 
 #: src/pages/company/ManufacturerPartDetail.tsx:54
-#: src/pages/part/PartDetail.tsx:525
+#: src/pages/part/PartDetail.tsx:537
 #: src/pages/purchasing/PurchasingIndex.tsx:26
 msgid "Suppliers"
 msgstr ""
@@ -3085,112 +3245,129 @@ msgstr ""
 msgid "Received Stock"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:66
-#: src/pages/stock/LocationDetail.tsx:56
+#: src/pages/part/CategoryDetail.tsx:77
+#: src/pages/stock/LocationDetail.tsx:84
 #: src/tables/settings/ErrorTable.tsx:34
 msgid "Path"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:82
+#: src/pages/part/CategoryDetail.tsx:93
 msgid "Parent Category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:98
+#: src/pages/part/CategoryDetail.tsx:109
 msgid "Subcategories"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:105
-#: src/pages/stock/LocationDetail.tsx:95
+#: src/pages/part/CategoryDetail.tsx:116
+#: src/pages/stock/LocationDetail.tsx:123
 #: src/tables/part/PartCategoryTable.tsx:69
 msgid "Structural"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:115
+#: src/pages/part/CategoryDetail.tsx:122
+msgid "Parent default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:129
+msgid "Default location"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:140
 msgid "Top level part category"
 msgstr ""
 
-#: src/pages/part/CategoryDetail.tsx:126
+#: src/pages/part/CategoryDetail.tsx:150
+#: src/pages/part/CategoryDetail.tsx:164
+#: src/tables/part/PartCategoryTable.tsx:96
+msgid "Edit Part Category"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:159
+msgid "Category Actions"
+msgstr ""
+
+#: src/pages/part/CategoryDetail.tsx:176
 msgid "Category Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:122
 msgid "Variant of"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:129
 #: src/tables/notifications/NotificationsTable.tsx:31
 msgid "Category"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:135
 msgid "Default Location"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:137
+#: src/pages/part/PartDetail.tsx:142
+msgid "Category Default Location"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:149
 msgid "IPN"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:144
+#: src/pages/part/PartDetail.tsx:156
 msgid "Revision"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:151
+#: src/pages/part/PartDetail.tsx:163
 #: src/tables/purchasing/ManufacturerPartParameterTable.tsx:39
 msgid "Units"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:158
+#: src/pages/part/PartDetail.tsx:170
 #: src/tables/settings/PendingTasksTable.tsx:40
 msgid "Keywords"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:165
+#: src/pages/part/PartDetail.tsx:177
 #: src/pages/purchasing/PurchaseOrderDetail.tsx:155
 #: src/pages/sales/ReturnOrderDetail.tsx:121
 #: src/pages/sales/SalesOrderDetail.tsx:125
 msgid "Link"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:177
+#: src/pages/part/PartDetail.tsx:189
 #: src/tables/build/BuildLineTable.tsx:115
 msgid "Available Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:183
-#: src/tables/stock/StockItemTable.tsx:270
-msgid "In Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:189
+#: src/pages/part/PartDetail.tsx:201
 msgid "Minimum Stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:195
+#: src/pages/part/PartDetail.tsx:207
 #: src/tables/bom/BomTable.tsx:188
 #: src/tables/build/BuildLineTable.tsx:92
 msgid "On order"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:204
+#: src/pages/part/PartDetail.tsx:216
 msgid "Allocated to Build Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:215
+#: src/pages/part/PartDetail.tsx:227
 msgid "Allocated to Sales Orders"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:225
+#: src/pages/part/PartDetail.tsx:237
 #: src/tables/bom/BomTable.tsx:212
 msgid "Can Build"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:232
+#: src/pages/part/PartDetail.tsx:244
 #: src/tables/bom/BomTable.tsx:196
 #: src/tables/part/PartTable.tsx:92
 msgid "Building"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:241
+#: src/pages/part/PartDetail.tsx:253
 #: src/tables/bom/UsedInTable.tsx:66
 #: src/tables/build/BuildOrderTable.tsx:102
 #: src/tables/machine/MachineListTable.tsx:320
@@ -3198,138 +3375,130 @@ msgstr ""
 #: src/tables/part/PartVariantTable.tsx:15
 #: src/tables/plugin/PluginListTable.tsx:190
 #: src/tables/plugin/PluginListTable.tsx:634
-#: src/tables/stock/StockItemTable.tsx:234
+#: src/tables/stock/StockItemTable.tsx:247
 msgid "Active"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:246
+#: src/pages/part/PartDetail.tsx:258
 msgid "Template Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:251
+#: src/pages/part/PartDetail.tsx:263
 #: src/tables/bom/BomTable.tsx:240
 msgid "Assembled Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:256
+#: src/pages/part/PartDetail.tsx:268
 msgid "Component Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:261
+#: src/pages/part/PartDetail.tsx:273
 #: src/tables/bom/BomTable.tsx:235
 msgid "Trackable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:266
+#: src/pages/part/PartDetail.tsx:278
 msgid "Purchaseable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:271
+#: src/pages/part/PartDetail.tsx:283
 msgid "Saleable Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:276
+#: src/pages/part/PartDetail.tsx:288
 msgid "Virtual Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:284
+#: src/pages/part/PartDetail.tsx:296
 msgid "Creation Date"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:289
+#: src/pages/part/PartDetail.tsx:301
 msgid "Created By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:303
-msgid "Default Supplier"
-msgstr ""
-
 #: src/pages/part/PartDetail.tsx:310
 #~ msgid "Edit part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:314
-#: src/tables/bom/BomTable.tsx:137
-#: src/tables/part/PartTable.tsx:161
-msgid "Price Range"
+#: src/pages/part/PartDetail.tsx:315
+msgid "Default Supplier"
 msgstr ""
 
 #: src/pages/part/PartDetail.tsx:322
 #~ msgid "Duplicate part"
 #~ msgstr ""
 
+#: src/pages/part/PartDetail.tsx:326
+#: src/tables/bom/BomTable.tsx:137
+#: src/tables/part/PartTable.tsx:161
+msgid "Price Range"
+msgstr ""
+
 #: src/pages/part/PartDetail.tsx:327
 #~ msgid "Delete part"
 #~ msgstr ""
 
-#: src/pages/part/PartDetail.tsx:349
-#: src/pages/stock/StockDetail.tsx:116
+#: src/pages/part/PartDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:120
 msgid "Last Stocktake"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:384
+#: src/pages/part/PartDetail.tsx:396
 msgid "Stocktake By"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:449
+#: src/pages/part/PartDetail.tsx:461
 msgid "Part Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:473
+#: src/pages/part/PartDetail.tsx:485
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:480
-#: src/pages/stock/StockDetail.tsx:235
+#: src/pages/part/PartDetail.tsx:492
+#: src/pages/stock/StockDetail.tsx:239
 msgid "Allocations"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:500
+#: src/pages/part/PartDetail.tsx:512
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:512
+#: src/pages/part/PartDetail.tsx:524
 #: src/pages/purchasing/PurchasingIndex.tsx:37
 msgid "Manufacturers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:551
+#: src/pages/part/PartDetail.tsx:563
 msgid "Scheduling"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:561
+#: src/pages/part/PartDetail.tsx:573
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:572
+#: src/pages/part/PartDetail.tsx:584
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:629
+#: src/pages/part/PartDetail.tsx:641
 msgid "Edit Part"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:650
+#: src/pages/part/PartDetail.tsx:673
 msgid "Stock Actions"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:655
-msgid "Count Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:656
+#: src/pages/part/PartDetail.tsx:681
 msgid "Count part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:660
-msgid "Transfer Stock"
-msgstr ""
-
-#: src/pages/part/PartDetail.tsx:661
+#: src/pages/part/PartDetail.tsx:691
 msgid "Transfer part stock"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:667
+#: src/pages/part/PartDetail.tsx:700
 msgid "Part Actions"
 msgstr ""
 
@@ -3412,43 +3581,57 @@ msgstr ""
 msgid "Pending Shipments"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:72
+#: src/pages/stock/LocationDetail.tsx:100
 msgid "Parent Location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:89
+#: src/pages/stock/LocationDetail.tsx:117
 msgid "Sublocations"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:101
+#: src/pages/stock/LocationDetail.tsx:129
 msgid "External"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:110
+#: src/pages/stock/LocationDetail.tsx:138
 msgid "Top level stock location"
 msgstr ""
 
-#: src/pages/stock/LocationDetail.tsx:121
+#: src/pages/stock/LocationDetail.tsx:149
 msgid "Location Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:91
+#: src/pages/stock/LocationDetail.tsx:173
+msgid "Default Parts"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:192
+#: src/pages/stock/LocationDetail.tsx:277
+#: src/tables/stock/StockLocationTable.tsx:106
+msgid "Edit Stock Location"
+msgstr ""
+
+#: src/pages/stock/LocationDetail.tsx:272
+msgid "Location Actions"
+msgstr ""
+
+#: src/pages/stock/StockDetail.tsx:95
 msgid "Base Part"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:98
+#: src/pages/stock/StockDetail.tsx:102
 msgid "Stock Status"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:110
+#: src/pages/stock/StockDetail.tsx:114
 msgid "Last Updated"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:137
+#: src/pages/stock/StockDetail.tsx:141
 #: src/tables/build/BuildLineTable.tsx:38
 #: src/tables/part/PartTable.tsx:117
-#: src/tables/stock/StockItemTable.tsx:141
-#: src/tables/stock/StockItemTable.tsx:255
+#: src/tables/stock/StockItemTable.tsx:154
+#: src/tables/stock/StockItemTable.tsx:268
 msgid "Available"
 msgstr ""
 
@@ -3460,15 +3643,15 @@ msgstr ""
 #~ msgid "Unlink custom barcode from stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:162
+#: src/pages/stock/StockDetail.tsx:166
 msgid "Installed In"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:169
+#: src/pages/stock/StockDetail.tsx:173
 msgid "Consumed By"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:190
+#: src/pages/stock/StockDetail.tsx:194
 msgid "Packaging"
 msgstr ""
 
@@ -3480,57 +3663,54 @@ msgstr ""
 #~ msgid "Delete stock item"
 #~ msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:224
+#: src/pages/stock/StockDetail.tsx:228
 msgid "Stock Details"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:230
+#: src/pages/stock/StockDetail.tsx:234
 msgid "Stock Tracking"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:242
+#: src/pages/stock/StockDetail.tsx:246
 msgid "Test Data"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:256
+#: src/pages/stock/StockDetail.tsx:260
 msgid "Installed Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:262
+#: src/pages/stock/StockDetail.tsx:266
 msgid "Child Items"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:329
+#: src/pages/stock/StockDetail.tsx:346
 msgid "Stock Operations"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:334
+#: src/pages/stock/StockDetail.tsx:351
 msgid "Count stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:338
-#: src/tables/settings/TemplateTable.tsx:267
-#: src/tables/stock/StockItemTestResultTable.tsx:305
-msgid "Add"
-msgstr ""
-
-#: src/pages/stock/StockDetail.tsx:339
+#: src/pages/stock/StockDetail.tsx:361
+#: src/tables/stock/StockItemTable.tsx:401
 msgid "Add stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:344
+#: src/pages/stock/StockDetail.tsx:369
+#: src/tables/stock/StockItemTable.tsx:410
 msgid "Remove stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:348
+#: src/pages/stock/StockDetail.tsx:376
 msgid "Transfer"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:349
+#: src/pages/stock/StockDetail.tsx:377
+#: src/tables/stock/StockItemTable.tsx:430
 msgid "Transfer stock"
 msgstr ""
 
-#: src/pages/stock/StockDetail.tsx:361
+#: src/pages/stock/StockDetail.tsx:394
 msgid "Duplicate stock item"
 msgstr ""
 
@@ -3703,10 +3883,6 @@ msgstr ""
 msgid "Table filters"
 msgstr ""
 
-#: src/tables/RowActions.tsx:151
-msgid "Actions"
-msgstr ""
-
 #: src/tables/bom/BomTable.tsx:76
 msgid "This BOM item is defined for a different parent"
 msgstr ""
@@ -3738,7 +3914,7 @@ msgstr ""
 
 #: src/tables/bom/BomTable.tsx:205
 #: src/tables/part/PartTable.tsx:153
-#: src/tables/stock/StockItemTable.tsx:177
+#: src/tables/stock/StockItemTable.tsx:190
 msgid "Stock Information"
 msgstr ""
 
@@ -3864,7 +4040,7 @@ msgid "In production"
 msgstr ""
 
 #: src/tables/build/BuildLineTable.tsx:112
-#: src/tables/stock/StockItemTable.tsx:150
+#: src/tables/stock/StockItemTable.tsx:163
 msgid "No stock available"
 msgstr ""
 
@@ -4133,7 +4309,7 @@ msgstr ""
 msgid "Message"
 msgstr ""
 
-#: src/tables/part/ParametricPartTable.tsx:74
+#: src/tables/part/ParametricPartTable.tsx:80
 #: src/tables/part/PartParameterTable.tsx:83
 msgid "Internal Units"
 msgstr ""
@@ -4155,10 +4331,6 @@ msgstr ""
 msgid "New Part Category"
 msgstr ""
 
-#: src/tables/part/PartCategoryTable.tsx:96
-msgid "Edit Part Category"
-msgstr ""
-
 #: src/tables/part/PartCategoryTable.tsx:106
 msgid "Add Part Category"
 msgstr ""
@@ -4182,7 +4354,7 @@ msgid "Add parameter"
 msgstr ""
 
 #: src/tables/part/PartParameterTable.tsx:189
-#: src/tables/stock/StockItemTable.tsx:280
+#: src/tables/stock/StockItemTable.tsx:293
 msgid "Include Variants"
 msgstr ""
 
@@ -4248,7 +4420,7 @@ msgid "Filter by part active status"
 msgstr ""
 
 #: src/tables/part/PartTable.tsx:183
-#: src/tables/stock/StockItemTable.tsx:245
+#: src/tables/stock/StockItemTable.tsx:258
 msgid "Assembly"
 msgstr ""
 
@@ -4625,7 +4797,7 @@ msgid "Sample"
 msgstr ""
 
 #: src/tables/plugin/PluginListTable.tsx:649
-#: src/tables/stock/StockItemTable.tsx:285
+#: src/tables/stock/StockItemTable.tsx:298
 msgid "Installed"
 msgstr ""
 
@@ -4677,65 +4849,65 @@ msgstr ""
 msgid "Are you sure you want to remove this manufacturer part?"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:73
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:86
 msgid "Part Description"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:94
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:130
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:107
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:143
 #: src/tables/purchasing/SupplierPartTable.tsx:123
 msgid "Pack Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:100
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:113
 msgid "Total Quantity"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:116
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:129
 msgid "Received"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:135
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:148
 msgid "Supplier Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:142
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:155
 msgid "Supplier Link"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:149
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:162
 msgid "Manufacturer Code"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:157
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:170
 msgid "Unit Price"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:163
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:176
 msgid "Destination"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:180
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:193
 msgid "Add Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:195
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:208
 msgid "Edit Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:203
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:216
 msgid "Delete Line Item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:214
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:227
 msgid "Receive line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:245
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:261
 msgid "Add line item"
 msgstr ""
 
-#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:251
+#: src/tables/purchasing/PurchaseOrderLineItemTable.tsx:266
 msgid "Receive items"
 msgstr ""
 
@@ -4942,26 +5114,31 @@ msgstr ""
 msgid "Next Run"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:119
+#: src/tables/settings/TemplateTable.tsx:120
 msgid "{templateTypeTranslation} with id {id} not found"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:123
+#: src/tables/settings/TemplateTable.tsx:124
 msgid "An error occurred while fetching {templateTypeTranslation} details"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:145
+#: src/tables/settings/TemplateTable.tsx:146
 msgid "actions"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:212
+#: src/tables/settings/TemplateTable.tsx:213
+#: src/tables/settings/TemplateTable.tsx:275
 msgid "Enabled"
 msgstr ""
 
-#: src/tables/settings/TemplateTable.tsx:242
+#: src/tables/settings/TemplateTable.tsx:243
 msgid "Create new"
 msgstr ""
 
+#: src/tables/settings/TemplateTable.tsx:276
+msgid "Filter by enabled status"
+msgstr ""
+
 #: src/tables/settings/UserTable.tsx:69
 msgid "User with id {id} not found"
 msgstr ""
@@ -5027,155 +5204,204 @@ msgstr ""
 msgid "Edit user"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:65
+#: src/tables/stock/StockItemTable.tsx:78
 msgid "This stock item is in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:74
+#: src/tables/stock/StockItemTable.tsx:87
 msgid "This stock item has been assigned to a sales order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:83
+#: src/tables/stock/StockItemTable.tsx:96
 msgid "This stock item has been assigned to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:92
+#: src/tables/stock/StockItemTable.tsx:105
 msgid "This stock item is installed in another stock item"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:101
+#: src/tables/stock/StockItemTable.tsx:114
 msgid "This stock item has been consumed by a build order"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:110
+#: src/tables/stock/StockItemTable.tsx:123
 msgid "This stock item has expired"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:114
+#: src/tables/stock/StockItemTable.tsx:127
 msgid "This stock item is stale"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:125
+#: src/tables/stock/StockItemTable.tsx:138
 msgid "This stock item is fully allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:132
+#: src/tables/stock/StockItemTable.tsx:145
 msgid "This stock item is partially allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:161
+#: src/tables/stock/StockItemTable.tsx:174
 msgid "This stock item has been depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:235
+#: src/tables/stock/StockItemTable.tsx:248
 msgid "Show stock for active parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:240
+#: src/tables/stock/StockItemTable.tsx:253
 msgid "Filter by stock status"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:246
+#: src/tables/stock/StockItemTable.tsx:259
 msgid "Show stock for assmebled parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:250
+#: src/tables/stock/StockItemTable.tsx:263
 msgid "Allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:251
+#: src/tables/stock/StockItemTable.tsx:264
 msgid "Show items which have been allocated"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:256
+#: src/tables/stock/StockItemTable.tsx:269
 msgid "Show items which are available"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:260
+#: src/tables/stock/StockItemTable.tsx:273
 #: src/tables/stock/StockLocationTable.tsx:37
 msgid "Include Sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:261
+#: src/tables/stock/StockItemTable.tsx:274
 msgid "Include stock in sublocations"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:265
+#: src/tables/stock/StockItemTable.tsx:278
 msgid "Depleted"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:266
+#: src/tables/stock/StockItemTable.tsx:279
 msgid "Show depleted stock items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:271
+#: src/tables/stock/StockItemTable.tsx:284
 msgid "Show items which are in stock"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:275
+#: src/tables/stock/StockItemTable.tsx:288
 msgid "In Production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:276
+#: src/tables/stock/StockItemTable.tsx:289
 msgid "Show items which are in production"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:281
+#: src/tables/stock/StockItemTable.tsx:294
 msgid "Include stock items for variant parts"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:286
+#: src/tables/stock/StockItemTable.tsx:299
 msgid "Show stock items which are installed in other items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:290
+#: src/tables/stock/StockItemTable.tsx:303
 msgid "Sent to Customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:291
+#: src/tables/stock/StockItemTable.tsx:304
 msgid "Show items which have been sent to a customer"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:295
+#: src/tables/stock/StockItemTable.tsx:308
 msgid "Is Serialized"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:296
+#: src/tables/stock/StockItemTable.tsx:309
 msgid "Show items which have a serial number"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:303
+#: src/tables/stock/StockItemTable.tsx:316
 msgid "Has Batch Code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:304
+#: src/tables/stock/StockItemTable.tsx:317
 msgid "Show items which have a batch code"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:309
+#: src/tables/stock/StockItemTable.tsx:322
 msgid "Tracked"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:310
+#: src/tables/stock/StockItemTable.tsx:323
 msgid "Show tracked items"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:314
+#: src/tables/stock/StockItemTable.tsx:327
 msgid "Has Purchase Price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:315
+#: src/tables/stock/StockItemTable.tsx:328
 msgid "Show items which have a purchase price"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:323
+#: src/tables/stock/StockItemTable.tsx:336
 msgid "External Location"
 msgstr ""
 
-#: src/tables/stock/StockItemTable.tsx:324
+#: src/tables/stock/StockItemTable.tsx:337
 msgid "Show items in an external location"
 msgstr ""
 
+#: src/tables/stock/StockItemTable.tsx:403
+msgid "Add a new stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:412
+msgid "Remove some quantity from a stock item"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:434
+msgid "Move Stock items to new locations"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:441
+msgid "Change stock status"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:443
+msgid "Change the status of stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:450
+msgid "Merge stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:452
+msgid "Merge stock items"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:459
+msgid "Order stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:461
+#: src/tables/stock/StockItemTable.tsx:467
+msgid "Order new stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:465
+msgid "Assign to customer"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:474
+msgid "Delete stock"
+msgstr ""
+
+#: src/tables/stock/StockItemTable.tsx:476
+msgid "Delete stock items"
+msgstr ""
+
 #: src/tables/stock/StockItemTestResultTable.tsx:125
 msgid "Test"
 msgstr ""
@@ -5285,10 +5511,6 @@ msgstr ""
 msgid "Add Stock Location"
 msgstr ""
 
-#: src/tables/stock/StockLocationTable.tsx:106
-msgid "Edit Stock Location"
-msgstr ""
-
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""